2012-07-17 51 views
14

tengo un elemento que posee un atributo cuyo valor está unido a un nocaut observable:Inicializar Knockout observable de valor de atributo elemento

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

Cuando se carga el elemento me gustaría la observable para contener el valor definido en el elemento dom, sin embargo, en lugar carga como indefinido y el atributo se retira del elemento DOM alltogether:

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

¿es posible t o inicializar el valor de un observable de knockout a partir de un atributo de elemento dom y persistir también el valor del atributo de elemento dom?

ACTUALIZACIÓN: http://jsfiddle.net/5Z2SC/10/

Respuesta

19

Otra opción sería utilizar una unión de encargo, y cobrar el valor actual del elemento en la función init. Esto es mucho más reutilizable, en mi opinión.

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)) 
    } 
}; 

Por supuesto, la suya será más complicado, ya que debe ser hacer algo con esta propiedad transformar. Esa lógica probablemente quiera ir en la sección update.

5

los atributos enlazar datos no se analizan hasta que llame ko.applyBindings(). Entonces, si necesita obtener datos de atributos de sus elementos, puede hacerlo así.

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

ko.applyBindings(new MyModel()); 

básicamente, usted está tomando el valor del atributo y se establece como el valor inicial de la observable. los atributos de vinculación de datos están destinados a ser una plantilla, por lo que los valores iniciales o predeterminados deben especificarse en su ViewModel.

la otra opción es escribir una carpeta de encargo, que puede almacenar un defecto si los rendimientos observables null ...

+0

Gracias, pero fui con el controlador de enlace personalizado. Los valores predeterminados codificados para los observables inicializados no son lo que estoy buscando en este caso, ya que el valor del atributo del elemento será diferente dependiendo de cuál se cargue. – KodeKreachor

Cuestiones relacionadas