在 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
旗帜……啊