在StackOverflow社区的帮助下,我能够根据这个例子让我的脏标志实现工作:http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html
它完全符合我的要求,除了一个我不知道如何解决的用例。
基本上我有一个从数据库中自动填充的选择菜单。此选择菜单还有一个选项,可以对我的后端进行Ajax调用,并刷新选项列表,更新数据库并返回result
。这是事情变得毛茸茸的地方。
第一种方法工作正常,但是,它必须重新索引并重新应用我的整个viewModel
,并且需要大约2-3秒,在具有16g ram和SSD的本地计算机上运行。
jsondata.component.available_tags = result.available_tags;
ko.mapping.fromJS(jsondata, viewModel);
第二种方法也有效,并且几乎是即时的,然而,它设置了isDirty()
标志,我想避免,因为这些数据已经来自数据库,我不需要保存它。我也无法使用isDirty.reset()
方法,因为如果在我点击菜单选项更新isDirty
之前由其他内容设置available_tags
,它也会重置该值。我也想避免。
viewModel().component.available_tags(result.available_tags);
我的问题是:使用第一种方法,我可以在特定元素而不是整个数据集上强制使用ko.mapping.fromJS()
进行UI刷新吗?或者,使用第二种方法,我可以避免在更新isDirty
时设置available_tags
标志吗?扭曲的是我仍然需要将available_tags
作为可观察对象,因此选择菜单会自动生成/更新。
更新:我能够使用
更新该单个元素的映射ko.mapping.fromJS(result.available_tags, {}, viewModel().component.available_tags);
但是立即引发isDirty
旗帜...... Argh
答案 0 :(得分:1)
除了Tomalak的建议,我完全赞同,也许toJSON方法可以帮助你在类似的情况下,你不想拆分模型。如果你的脏标志实现使用ko.toJSON作为哈希函数,就像Ryan Niemeyer那样,你可以给你的模型(脏标志处于活动状态)一个toJSON方法,你可以这样做:
function MyObjectConstructor() {
this.someProperty = ko.observable();
this.somePropertyNotUsedInDirtyFlag = ko.observable();
}
MyObjectConstructor.prototype.toJSON = function () {
var result = ko.toJS(this);
delete result.somePropertyNotUsedInDirtyFlag;
return result;
};
请注意,这也用于序列化其他一些场景中的对象,例如ajax调用。它通常是一个方便的函数,用于在不同的上下文中使用它们之前从对象中删除计算机等。