Как остановить оценку привязок Knockout.js для дочерних элементов

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

причина по которой...

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


person Aran Mulholland    schedule 13.02.2012    source источник


Ответы (2)


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

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

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

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

Образец: http://jsfiddle.net/rniemeyer/tWJxh/

Однако, как правило, вы будете использовать несколько моделей представления под основной моделью представления, используя привязку with.

person RP Niemeyer    schedule 13.02.2012
comment
Отличная вещь, именно то, что я хотел. Мой сценарий может быть нетипичным, но он дает мне настоящий подход к загрузке, основанный на модулях, где каждый модуль независим от всех остальных, что делает тестирование увлекательным... - person Aran Mulholland; 13.02.2012
comment
Это заставляет использовать дополнительный контейнер просто для остановки креплений; Было бы легко сделать так, чтобы узлы без контейнеров (комментариев) поддерживали пользовательские обработчики привязки, такие как вышеупомянутые stopBindings? Это было бы полезно в модульных приложениях :) - person AlexG; 24.04.2012
comment
В версии 2.1 (в RC) возможны настраиваемые обработчики привязки без контейнера, такие как: . Так что проблем не будет. В версии 2.0 ko.virtualElements.allowedBindings не выставлялся. - person RP Niemeyer; 24.04.2012
comment
У меня проблемы с элементами управленияDescendantBindings. Почему jsfiddle.net/C6wXY не связывает дочерний список в foreach? Когда я делаю что-то подобное в своем коде, привязка foreach обрабатывается родителем независимо от возврата controlDescendantBindings: true из функции инициализации bindingHandler. - person Dale Anderson; 05.07.2012

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

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

Затем выполните ko.applyBinding(navVM, "navSection") и ko.applyBinding(contentVM, "contentSection").

person John Papa    schedule 13.02.2012
comment
ммм... жаль, что непросто создать два отдельных контекста привязки, которые находятся в одном и том же поддереве. - person Aran Mulholland; 13.02.2012
comment
вы можете это сделать (см. примечание Райана), я просто сказал, что было бы более структурировано думать о ваших компонентах как об их собственных слабо связанных модулях. - person John Papa; 13.02.2012