У меня есть модель нокаута, которая имеет несколько наблюдаемых свойств:Создание привязки обработчика Нокаут, который зависит от «дерева» наблюдаемых
var personViewModel = {
name: ko.observable('Bob'),
age: ko.observable(123)
};
Я хотел бы создать пользовательские привязки, который делает вид лица модели. Однако я хотел бы, чтобы эта привязка обновлялась, если обновлены какие-либо дочерние свойства, то есть name
или age
.
С помощью bindHandler метод обновления запускается только при обновлении свойства boundableable, а не при изменении дочернего свойства на связанных наблюдаемых изменениях.
В качестве обходного Я добавляю подписки на дочерние свойства в функции init
:
ko.bindingHandlers.foo = {
init: function (element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
// setup code goes here ... DOM elements inserted etc....
valueAccessor().age.subscribe(function() {
// Update the UI
});
valueAccessor().name.subscribe(function() {
// Update the UI
});
},
update: function (element, valueAccessor, allBindingsAccessor,
viewModel, bindingContext) {
// Update the UI
}
};
Примечание: это упрощенный пример, у меня есть общий подход к подписке на несколько дочерних наблюдаемыми!
Это хороший способ подойти к проблеме? Или есть какая-то встроенная функция нокаута, которую я пропускаю здесь?
Это на самом деле довольно умный ... –
Удивительный - это работает (+1), но ... как это работает? Я понимаю, что делает 'toJS', но не почему это должно заставить привязку обновляться при изменении любого из значений? – ColinE
Ну, он выполняет итерацию дерева объектов и разворачивает наблюдаемые, которые будут разрешать зависимости – Anders