2

在 StackOverflow 社区的一些帮助下,我能够让我的脏标志实现工作,基于这个例子:http ://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html

它完全符合我的要求,除了一个我不知道如何解决的用例。

基本上我有一个从数据库中自动填充的选择菜单。这个选择菜单还有一个选项可以对我的后端进行 Ajax 调用,并刷新选项列表、更新数据库并返回result. 这就是让我毛骨悚然的地方。

第一种方法效果很好,但是,它必须重新索引并重新应用我的全部viewModel,大约需要 2-3 秒,在具有 16gigs 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旗帜……啊

4

1 回答 1

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

于 2013-11-14T13:54:27.997 回答