В любом случае я могу сказать, что плагин отображения нокаутов для подписки на все изменения свойств вызывает определенную функцию?
Я понимаю, что могу вручную подписаться на событие изменения свойства следующим образом:
var viewModel = {
name: ko.observable('foo'),
}
// subscribe manually here
viewModel.name.subscribe(function(newValue){
// do work
})
Я хотел бы иметь возможность в целом подписываться, так как мои модели просмотра могут отличаться, я не хочу жестко указывать имена свойств. Я создал функцию, которая делает это, но это может быть не лучший подход. Он работает во всех браузерах, кроме IE7 и ниже.
Здесь я беру viewmodel в качестве аргумента и пытаюсь задуматься о том, что он подписывается на свойства:
function subscribeToKO(data) {
$.each(data, function (property, value) {
if (getType(value) == "Object")
data[property] = subscribeToKO(value);
else if (getType(value) == "Array") {
$.each(value, function (index, item) {
item = subscribeToKO(item);
});
}
else {
if (value.subscribe) {
value.subscribe(function (newValue) {
// do work
});
}
}
});
return data;
}
Как я уже сказал, это работает, но поскольку я использую подключаемый модуль отображения, я надеялся, что есть крючок, который я мог бы использовать, чтобы предоставить ему функцию, которая будет в целом подписаться на изменения свойств.
Что-то вроде:
mapping = {
create: function(options){
options.data.subscribe(function(newValue){
// do work ???
});
}
}
ko.mapping.fromJS(viewModel, mapping);
Любые идеи?