knockout data change array data-binding knockout.js elements

data-binding - data - ko js subscribe



Cómo detener los enlaces de knockout.js que evalúan elementos secundarios (2)

Usando knockout, cuando llamas a ko.applyBinding(viewModel, "divId") realiza un enlace recursivo hacia abajo a través de los elementos secundarios del elemento al que te has vinculado ("divId"). Me gustaría detener esta evaluación en un nodo secundario. ¿Hay alguna forma de hacer esto?

la razón por la cual...

Me gustaría enlazar toda la página a un modelo de vista de navegación, esto manejará el diseño básico y ... la navegación con una sonrisa. En las distintas páginas, me gustaría enlazar ciertas regiones a diferentes modelos de vista que no son propiedades del modelo de vista de navegación. En este momento, si hago esto, obtengo errores de "no se puede analizar el enlace" ya que el modelo de vista de navegación no tiene las propiedades requeridas. Si pudiera detener el enlace caminando por el dom, solo podría unir estos elementos por separado.


Hay varias formas en que puedes ir en este caso. Por lo general, agregaría múltiples modelos de vista "sub" a un modelo de vista principal y luego usaría el enlace con las distintas áreas con los modelos de vista reales para vincularlos.

Es posible hacer técnicamente lo que buscas. Puede crear un enlace personalizado que le diga a KO que manejará el enlace de los propios hijos. Se vería como:

ko.bindingHandlers.stopBindings = { init: function() { return { controlsDescendantBindings: true }; } };

Cuando colocas esto en un elemento, KO ignorará a los niños. Luego, puede llamar a ko.applyBindings en un elemento secundario de este elemento con un modelo de vista diferente.

Ejemplo: http://jsfiddle.net/rniemeyer/tWJxh/

Sin embargo, normalmente, se usarían varios modelos de vista debajo de un modelo de vista principal utilizando el enlace with .


Una forma en que he hecho esto es crear una sección para la navegación (o simplemente a) y vincularla a la navVM. Luego cree otra sección para el contenido y vincule el contentVM a él. De esa manera no hay conflicto y todo está muy separado.

<body> <div id="navSection"> </div> <div id="contentSection"> </div> </body>

Luego haga ko.applyBinding (navVM, "navSection") y ko.applyBinding (contentVM, "contentSection")