2012-02-02 59 views
1

当我的用户登录时,我从服务器加载一堆数据。这需要花费很多时间,因为似乎每一次对observableArray()的添加都会更新依赖的观察值。我想推迟评估所有依赖关系,直到所有数据加载完毕。我已经看到如何使用deferEvaluation: true来影响特定ko.computed()变量的行为,但我希望将observable隔离直到我知道它已完成更新,然后使整个模型无效以重新绘制视图。当使用knockoutjs加载数据时推迟依赖关系

我创建了一个jsfiddle来说明问题。请注意,在我的真实代码中,我使用映射插件来加载对象,但在此我只模拟了每个状态更改都会调用的.subscribe函数的所有依赖关系。我想阻止它直到最后才被调用。

回答

4

通常情况下,在这种情况下,您可以从observableArray访问底层数组并推送到它。然后,您要么将最后一个推向observableArray,要么拨打myObservableArray.valueHasMutated()

所以,总的来说它看起来像:

var underlyingArray = this.items(); 
underlyingArray.push(one); 
underlyingArray.push(two); 
underlyingArray.push(three); 
this.items.valueHasMutated(); 

在你的小提琴,你可以做this.document().history().push(this);。然后,如果您希望订阅运行,则必须返回并在受影响的文档上调用valueHasMutated()。

+1

这个解决方案的一个问题是它似乎不适用于'ko.mapping'插件。在通话完成之前,我看到更新从'ko.mapping.fromJS'调用中传播到显示器。 – 2012-02-02 22:54:20