2012-07-17 11 views
14

Ho un elemento che possiede un attributo il cui valore è legato a un ko osservabile:Inizializza Knockout osservabile dal valore di attributo elemento

<text transform='matrix(1 0 0 1 1 1)' data-bind='attr:{transform:textTransform}'></text>

Quando i carichi di elementi vorrei osservabile per contenere il valore definita sull'elemento dom, tuttavia esso carica invece indefinita e l'attributo viene rimosso dall'elemento dom alltogether:

<text data-bind='attr:{transform:textTransform}'></text>

è possibile t o inizializzare il valore di un knockout osservabile da un attributo dom elemento e mantenere anche il valore dell'attributo dom elemento?

UPDATE: http://jsfiddle.net/5Z2SC/10/

risposta

19

Un'altra opzione sarebbe quella di utilizzare un costume vincolante, e raccogliere il valore corrente dell'elemento in la funzione init. Questo è molto più riutilizzabile, secondo me.

ko.bindingHandlers.transform = { 
    init: function(element, valueAccessor) { 
     valueAccessor()(element.getAttribute('transform')); 
    }, 
    update: function(element, valueAccessor) { 
     var value = valueAccessor(); 
     element.setAttribute('transform', ko.utils.unwrapObservable(value)) 
    } 
}; 

Naturalmente, il vostro sarà più complicato, dal momento che è necessario essere fare qualcosa con questa proprietà transform. Probabilmente questa logica vorrà andare nella sezione update.

5

gli attributi dei dati-bind non vengono analizzati fino alla chiamata ko.applyBindings(). Quindi se hai bisogno di ottenere i dati degli attributi dai tuoi elementi puoi farlo in questo modo.

function MyModel(){ 
    this.textTransform = ko.observable($('#myElement').attr('transform')); 
} 

ko.applyBindings(new MyModel()); 

in pratica, si acquisisce il valore dell'attributo e lo si imposta come valore iniziale dell'osservabile. gli attributi data-bind sono pensati per essere un modello, quindi i valori iniziali o predefiniti devono essere specificati nel ViewModel.

l'altra opzione è quella di scrivere un legante personalizzato, che può memorizzare un default se i rendimenti osservabili apertura null ...

+0

Grazie, ma sono andato con il gestore di binding personalizzato. I valori predefiniti codificati per gli osservabili inizializzati non sono ciò che sto cercando in questo caso poiché il valore dell'attributo dell'elemento sarà diverso a seconda di quale viene caricato. – KodeKreachor

Problemi correlati