KnockoutJS:停止设置脏标志的特定属性

时间:2013-11-13 19:28:42

标签: javascript knockout.js knockout-mapping-plugin

在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

1 个答案:

答案 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调用。它通常是一个方便的函数,用于在不同的上下文中使用它们之前从对象中删除计算机等。