Knockout异步可观察模式变成无限循环

时间:2013-07-02 15:38:19

标签: knockout.js

我有这样的观点:

<xsl:comment>ko with: resolve(1)</xsl:comment>
<xsl:comment>ko template: { name: typeName }</xsl:comment>
<xsl:comment>/ko</xsl:comment>
<xsl:comment>/ko</xsl:comment>

和一个viewmodel(视图的datacontext),其方法如下:

self.resolve = function (id) {
    var obs = ko.observable(null);
    self.getItemByIdAsync(id).done(obs);
    return obs;
};

由于某种原因,这会变成无限循环。我的猜测是with-binding认为它取决于可观察的obs的值,当它被更新时,with-binding尝试再次运行resolve,并且一次又一次......

如何修改此代码,以便仅运行一次解决方案?


我要做的是拥有一个动态视图模型,以适应视图要呈现的内容。如果视图尝试解析某个viewmodel-context中的项,则应该将此项加载为异步,为其创建一个新的viewmodel,并将其作为child-viewmodel添加到datacontext-vm。

我在其他地方看到过这种异步可观察模式,但我似乎错误地使用了它。

1 个答案:

答案 0 :(得分:0)

您的观察是正确的,只要您尝试设置self.resolve,就会调用obs,以下内容来自knockout doc

  

如果您提供的表达式涉及任何可观察值,则只要有任何可观察值发生变化,就会重新评估表达式。

我不知道您将self.resolve函数与with一起使用的原因,我对此问题的处理方法可能如下:

function ViewMode() {
    ...
    self.obs = ko.observable(null);

    self.resolve = function (id) {
        self.getItemByIdAsync(id).done(self.obs);
    };

    self.resolve(1); // kick start the UI with id = 1
}

然后在视图中,只需使用data-bind="with: obs"