KnockoutJS如何在所有加载后重置跟踪更改

时间:2014-12-22 14:36:26

标签: knockout.js

我已将changeTracker here添加到我的ko应用程序中,但在我的所有绑定更新后无法初始化它。我正在做几个ajax调用来从sql server数据库加载数据,并调用

viewModel.tracker().markCurrentStateAsClean();

在更新了数据库中的所有内容之后,显然ko在尝试重置/初始化跟踪机制后仍然忙于加载数据。也就是说,即使在重置之后,somethingHasChanged函数仍然是真的。我暂时添加了

setTimeout(function () { viewModel.tracker().markCurrentStateAsClean(); }, 4000);

这可行,但它似乎可能导致网络速度慢或带宽需要更长时间的低带宽情况的问题。您可以参考我以前的SO问题here。有更好的方法吗?

更新

我的数据库调用使用

$.when(fcn1(), fcn2(), fcn3(), fcn4())
.done(function msg1, msg2, msg3, msg4) {
    // initialize ko objects, "assistants", "teachers", "assistants" not assigned, etc.
}) 
.fail(function blah blah blah) {});

所以我尝试添加

viewModel.tracker().markCurrentStateAsClean();

在doneCallback的末尾,甚至到调用那些视图模型函数的jQuery / javascript fcns的结尾都没有用 - 即使我尝试重置它,somethingHasChanged()仍然为true。如果我使用setTimeout调用等待4秒,显然在ko完成更新/绑定之后,somethingHasChanged()方法返回false。因此,在我认为它已经完成之后的0到4秒之间,当事情哈希变化()为假时它已经完成了。

我的视图模型由于最初设置的竞争条件依赖性而有很多扩展器,因此我不希望observables / observable数组通知订阅者,但只是在所有更新结束时一次,例如这样:

self.teachers = ko.observableArray().extend({ rateLimit: 0 });
self.columns = ko.observableArray().extend({ rateLimit: 0 });
self.assistants = ko.observableArray().extend({ rateLimit: 0 });
HTH在解释中。

0 个答案:

没有答案