2012-02-13 18 views
17

Usando knockout, cuando llame al ko.applyBinding(viewModel, "divId"), realiza un enlace recursivo hacia abajo a través de los elementos secundarios del elemento al que se vincula ("divId"). Me gustaría detener esta evaluación en un nodo secundario. ¿Hay alguna forma de hacer esto?Cómo detener la ejecución de enlaces knockout.js en elementos secundarios

la razón por la ...

me gustaría unir toda la página a una vista de modelo de navegación, este se encargará de diseño básico y ... sonreír ... navegación. En las distintas páginas me gustaría vincular ciertas regiones a diferentes modelos de vista que no son propiedades del modelo de vista de navegación. Por el 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, podría unir estos elementos por separado.

Respuesta

35

Hay varias maneras que usted puede ir en este caso. Normalmente, debe agregar múltiples modelos de vista "sub" a un modelo de vista principal y luego usar el enlace with en las diversas áreas con los modelos de vista reales para enlazarlos.

Es posible hacer técnicamente lo que está buscando. Puede crear un enlace personalizado que le indique a KO que gestionará el enlace de los elementos secundarios. Se vería así:

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

Cuando coloca esto en un elemento, KO ignorará los elementos secundarios. Luego, puede llamar a ko.applyBindings en un elemento secundario de este elemento con un modelo de vista diferente.

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

Por lo general, sin embargo, que utilizaría múltiples modelos de vista debajo de un modelo de vista principal mediante el with unión.

+1

Excelentes cosas, exactamente lo que quería. Mi escenario puede no ser típico, pero me da un verdadero enfoque de carga basado en módulos donde cada módulo es independiente de todos los demás, hace que las pruebas sean divertidas ... –

+0

Esto fuerza el uso de un contenedor adicional simplemente para detener los enlaces; ¿Sería fácil hacer que los nodos contenedores (comentarios) admitan manejadores de enlace personalizados como los stopBindings anteriores? Sería útil en aplicaciones altamente modulares :) – AlexG

+0

En 2.1 (en RC), controladores de enlace personalizados sin contenedor serán posibles como: http://jsfiddle.net/rniemeyer/75yQD/. Entonces, no habrá problema. En 2.0, 'ko.virtualElements.allowedBindings' no fue expuesto. –

3

Una forma de hacerlo es crear una sección para la navegación (o simplemente a) y vincular el navVM a ella. Luego, cree otra sección para el contenido y vincule el contentVM a ella. De esa manera no hay conflicto y todo está muy separado.

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

Después, realice ko.applyBinding (navVM, "navSection") y ko.applyBinding (contentVM, "contentSection")

+0

mmm ... lástima que no es fácil crear dos contextos de enlace separados que están en el mismo subárbol –

+1

que "puedes" hacerlo (mira la nota de Ryan), solo estaba diciendo que podría estar más estructurado para pensar en sus componentes como sus propios módulos débilmente acoplados. –

Cuestiones relacionadas