2012-03-01 17 views
7

Tengo una pregunta rápida sobre CustomBindings, espero que algunos me ayuden a explicarme? Pensé que cuando se actualiza un observable, cualquier unión personalizada que esté vinculada a ese observable tendría su método de "actualización" llamado. Puedo ver que cuando actualizo mi observable que otros suscriptores están siendo notificados, no parece que se llame al CustomBinding.Knockout + customBinding no está actualizando

Aquí es mi modelo de vista:

var innerModel = { 
    name: ko.observable('junk') 
}; 

var innerModel2 = { 
    name: ko.observable('junk2') 
}; 

var viewModel = { 
    im1: innerModel, 
    im2: innerModel2, 
    selectedModel: ko.observable({name:'xxx'}) 
}; 

y aquí está mi customBinding:

ko.bindingHandlers.custom = { 
    update: function(element, valueAccessor) { 
     console.log("BAM!"); 
     while (element.firstChild) 
      ko.removeNode(element.firstChild); 

     ko.renderTemplate('test', valueAccessor(), {}, element, 'replaceNode'); 

    } 
}; 

donde mi plantilla es simplemente un lapso que muestra el campo "Nombre":

<script id='test' type='text/html' charset='utf-8'> 
<span data-bind='text: name'></span> 
</script> 

Aquí está el código HTML que uso con el enlace personalizado:

<div id="container" data-bind="with: viewModel"> 
    <div data-bind="custom: selectedModel"> 
    </div> 
</div> 

Cuando actualizo selectedModel a cualquiera de los dos innerModels, se muestra el nombre correcto, pero no se está llamando a la función de 'actualización' del CustomBinding. Tengo un suscriptor independiente a la "selectedModel" observables:

viewModel.selectedModel.subscribe(function(newValue) { 
    console.log(newValue.name()); 
}); 

y que se llama cuando se cambia el selectedModel, ¿por qué no es actualización del customBinding siendo llamado?

Aquí es una jsFiddle que muestra el problema: http://jsfiddle.net/gperng/twAcJ/

se agradecería cualquier ayuda!

Respuesta

0

Su uso de with es incorrecto en este caso. Si se utiliza este, que funcionará como se espera:

<div id="container" data-bind="with: selectedModel"> 
    <div data-bind="custom: $data"> 
    </div> 
</div> 

Esto se debe en su ejemplo la unión custom no está en la selectedModel, pero sobre todo el propio modelo de vista, que no cambia.

Aquí está la jsFiddle de ella: http://jsfiddle.net/soniiic/twAcJ/7/

+1

no estoy 100% eso tiene sentido. Si elimino el div con el enlace "con", sigo teniendo el mismo problema que antes (donde el manejador de actualización del enlace personalizado no se está llamando a pesar de que se ha cambiado el observable). Además, en su ejemplo, el "init" del enlace personalizado se está llamando cada vez (porque el padre con es el observable y ha cambiado, por lo que todos los elementos secundarios a continuación se vuelven a representar). Consulte http://jsfiddle.net/gperng/6nw8B/, agregué una función "init" y puede ver que el enlace se vuelve a inicializar cada vez. –

9

Es necesario llamar a la siguiente función para hacer que funcione:

var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()) 

Prueba este violín para más: http://jsfiddle.net/twAcJ/13/

+0

Esto en realidad no funciona para mí. Solo imprime "BAM!" una vez, siempre A pesar de presionar todos los botones varias veces. Tenga en cuenta que seleccioné knockout 3.0.0 (aunque 2.3.0 tampoco funcionó). – Aktau

Cuestiones relacionadas