2012-02-13 5 views
17

Используя нокаут, когда вы вызываете ko.applyBinding(viewModel, "divId"), он рекурсивно связывается с дочерними элементами элемента, к которому вы привязались («divId»). Я хотел бы остановить эту оценку на дочернем узле. Есть ли способ сделать это?Как остановить привязки knockout.js на дочерних элементах

причина ...

Я хотел бы связать всю страницу с моделью навигации зрения, это будет обрабатывать основной макет и ... улыбка ... навигация. На разных страницах я хотел бы привязать определенные регионы к различным моделям просмотров, которые не являются свойствами модели навигационного представления. На данный момент, если я это сделаю, я получаю ошибки «невозможно разобрать привязку», поскольку модель навигационного представления не обладает требуемыми свойствами. Если бы я мог остановить привязку, идущую вниз по дому, я мог бы просто привязать эти предметы отдельно.

ответ

35

Есть несколько способов, которые вы можете пойти на это. Как правило, вы добавляете несколько моделей «под» в модель основного вида, а затем используйте привязку with для различных областей, где фактические модели просмотра привязываются к ним.

Технически можно делать то, что вам нужно. Вы можете создать пользовательскую привязку, которая сообщает KO, что она будет обрабатывать привязку самих детей. Это будет выглядеть так:

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

Когда вы размещаете это на элементе, KO игнорирует детей. Затем вы можете вызвать ko.applyBindings на дочернем элементе этого элемента с другой моделью представления.

Пример: http://jsfiddle.net/rniemeyer/tWJxh/

Как правило, хотя, вы должны использовать несколько моделей просмотра под основной модели представления, используя with связывания.

+1

Отличный материал, именно то, что я хотел. Мой сценарий может быть не типичным, но он дает мне настоящий подход к загрузке на основе модулей, где каждый модуль не зависит от всех остальных, делает тестирование весело ... –

+0

Это заставляет использовать дополнительный контейнер просто для остановки привязок; Было бы легко сделать, чтобы узлы, не содержащие контейнеров (комментарии), поддерживали пользовательские обработчики привязки, такие как вышеупомянутые stopBindings? Это было бы полезно в высокомодульных приложениях :) – AlexG

+0

В 2.1 (в RC) нестандартные обработчики привязки контейнера будут доступны как: http://jsfiddle.net/rniemeyer/75yQD/. Таким образом, это не будет проблемой. В 2.0, 'ko.virtualElements.allowedBindings' не был открыт. –

3

Один из способов сделать это - создать раздел для навигации (или просто a) и связать с ним navVM. Затем создайте еще один раздел для контента и привяжите его к нему. Таким образом, нет конфликта, и все это очень разлучено.

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

Затем сделайте ko.applyBinding (navVM, "navSection") и ko.applyBinding (contentVM, "contentSection")

+0

mmm ... жалости нелегко создать два отдельных контекста привязки, которые находятся в одном и том же поддереве –

+1

вы «можете» это сделать (см. Примечание Райана), я просто сказал, что может быть более структурировано, чтобы думать о ваши компоненты как их собственные слабо связанные модули. –

Смежные вопросы