2013-07-10 4 views
9

Sto riscontrando un problema nell'applicazione di gestori di binding personalizzati quando si utilizza knockout con requireJS. Fondamentalmente, in passato ho incluso un file js del gestore di binding globale che contiene tutti i miei binding personalizzati. Ora che sto usando requireJS per applicare le dipendenze, non sono sicuro di come accedere a questi binding personalizzati.Gestione binding personalizzata con Knockout e RequireJS

ho usato per fare creare le funzioni globali con

function KOCustomBindings() { 
// Custom Bindings 
ko.bindingHandlers.returnKey = { 
//handler code 
} 
} 

Ora che sto utilizzando richiede, mi sento come se dovessi avere una dichiarazione definire

define(['jquery', 'knockout'], 
    function($, ko)){ 
// Custom Bindings 
return KOCustomBindings; 
} 
}); 

Tuttavia, I don' Credo che le legature verranno eseguite a meno che non siano specificamente chiamate, forse in uno spessore? Qualcuno ha qualche idea su questo?

Grazie per il vostro aiuto,

risposta

9

Dal associazioni personalizzate modificano la ko oggetto, devono essere caricati solo una volta e i loro moduli non devono restituire nulla. Se hai una sezione main/entry/app come primo passo nella tua app, è sufficiente che tu richieda i tuoi binding ed estensori personalizzati.

define(['jquery', 'knockout'], function($, ko)){ 
    // Custom Bindings 
    ko.bindingHandlers.returnKey = { ... } 

    //NO return needed 
}); 

Poi, nella sezione di avvio, basta

require('lib/custom-ko-bindings'); 
3

Un modo semplice per farlo è quello di definire la vostra abitudine vincolante come modulo AMD e richiedono dal proprio ViewModel genitore. Esempio -

Bindings.js

define(, function() { 
    ko.bindingHandlers.Date = { 
     update: function (element, valueAccessor) { 
      var value = valueAccessor(); 
      var date = moment(value()); 
      var strDate = date.format('MM-DD-YYYY'); 
      $(element).text(strDate); 
     } 
    }; 
}); 

tuo viewmodel -

define(['jquery', 'knockout', 'bindings'], 
    function($, ko, bindings)){ 
}); 

Questo darà qualsiasi elemento nel vostro accesso al DOM Knockout gestore legame di 'Data', per esempio. (Il mio esempio è uno che ho usato con moment.js)

In qualsiasi vista del bambino o le viste che richiedono la vostra vista del modello genitore si dovrebbe ora essere in grado di utilizzare

<span data-bind="Date: myDate" /> 
3

sono stato in grado di raggiungere questo avvolgendo ko nel mio modulo di attacchi e restituendo l'istanza ko modificato. Ecco l'config ho finito con:

require.config({ 
    paths: { 
    'knockout': 'lib/knockout', // name that's only used once in customBindings.js 
    'ko': 'app/customBindings' 
    } 
    // more config ommitted 
}); 

mie associazioni personalizzate:

define(['knockout'], function (ko) { 
    ko.bindingHandlers.returnKey = { 
     //handler code 
    } 
    return ko; 
}); 

E i miei moduli che richiedono knockout solo necessario fare riferimento a 'ko'.

require(['jquery', 'ko', 'underscore'], function ($, ko, _) { 
    // do knockout-y things! now with bindings! 
});