gpt4 book ai didi

javascript - knockout JS : Stop a particular property from setting dirty flag

转载 作者:行者123 更新时间:2023-11-30 05:42:31 25 4
gpt4 key购买 nike

在 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 吗?或者,使用第二种方法,我可以避免在更新 available_tags 时设置 isDirty 标志吗?不同之处在于我仍然需要将 available_tags 保持为可观察的,因此选择菜单会自动生成/更新。

更新:我能够使用

更新单个元素的映射
ko.mapping.fromJS(result.available_tags, {}, viewModel().component.available_tags);

但是那立即触发了 isDirty 标志......啊

最佳答案

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

关于javascript - knockout JS : Stop a particular property from setting dirty flag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19962655/

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