Gab*_*abe 25 jquery knockout-mapping-plugin knockout.js
反正我是否可以告诉淘汰映射插件订阅所有属性更改调用某个函数?
我意识到我可以用这种方式手动订阅属性更改事件:
var viewModel = {
name: ko.observable('foo'),
}
// subscribe manually here
viewModel.name.subscribe(function(newValue){
// do work
})
Run Code Online (Sandbox Code Playgroud)
我希望能够一般订阅,因为我的视图模型可能会有所不同,我不想硬编码属性名称.我创建了一个执行此操作的函数,但它可能不是最好的方法.它适用于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;
}
Run Code Online (Sandbox Code Playgroud)
就像我说的那样有效,但由于我正在使用映射插入,我希望有一个钩子,我可以使用它来提供一个通常会订阅属性更改的函数.
就像是:
mapping = {
create: function(options){
options.data.subscribe(function(newValue){
// do work ???
});
}
}
ko.mapping.fromJS(viewModel, mapping);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这是基于Ryan Niemeyer肮脏旗帜的通用方法.
点击这里查看 JsFiddle.
HTML:
<ol>
<li>
Telephone : <input data-bind="value: telephone"/>
</li>
<li>
Address : <input data-bind="value: address"/>
</li>
</ol>?
Run Code Online (Sandbox Code Playgroud)
使用Javascript:
var model = {
telephone: ko.observable('0294658963'),
address: ko.observable('167 New Crest Rd')
};
// knockout extension for creating a changed flag (similar to Ryan's dirty flag except it resets itself after every change)
ko.changedFlag = function(root) {
var result = function() {};
var initialState = ko.observable(ko.toJSON(root));
result.isChanged = ko.dependentObservable(function() {
var changed = initialState() !== ko.toJSON(root);
if (changed) result.reset();
return changed;
});
result.reset = function() {
initialState(ko.toJSON(root));
};
return result;
};
// add changed flag property to the model
model.changedFlag = new ko.changedFlag(model);
// subscribe to changes
model.changedFlag.isChanged.subscribe(function(isChanged) {
if (isChanged) alert("model changed");
});
ko.applyBindings(model);?
Run Code Online (Sandbox Code Playgroud)