gpt4 book ai didi

jquery - KnockoutJS 使用映射插件订阅属性更改

转载 作者:行者123 更新时间:2023-12-03 21:37:56 26 4
gpt4 key购买 nike

我是否可以告诉 knockout 映射插件订阅所有属性更改调用某个函数?

我意识到我可以通过这种方式手动订阅属性更改事件:

var viewModel = {
name: ko.observable('foo'),
}

// subscribe manually here
viewModel.name.subscribe(function(newValue){
// do work
})

不过,我希望能够进行通用订阅,因为我的 View 模型可能会有所不同,所以我不想对属性名称进行硬编码。我创建了一个函数来执行此操作,但这可能不是最好的方法。它适用于除 IE7 及更低版本之外的所有浏览器。

在这里,我将 View 模型作为参数,并尝试通过订阅属性来反射(reflect)它:

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;
}

就像我说的,这是可行的,但由于我使用的是映射插件,我希望有一个钩子(Hook)可以用来为它提供一个通常订阅属性更改的函数。

类似于:

mapping = {
create: function(options){
options.data.subscribe(function(newValue){
// do work ???
});
}
}

ko.mapping.fromJS(viewModel, mapping);

有什么想法吗?

最佳答案

这是基于 Ryan Niemeyer's dirty flag 的通用方法.
单击此处获取 JsFiddle .

HTML:

<ol>
<li>
Telephone : <input data-bind="value: telephone"/>
</li>
<li>
Address : <input data-bind="value: address"/>
</li>
</ol>​

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);​

关于jquery - KnockoutJS 使用映射插件订阅属性更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10143682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com