0

我有这样的看法:

<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>

和一个视图模型(视图的数据上下文),其方法如下:

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

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

如何修改此代码以便解析只运行一次?


我想要做的是有一个动态的视图模型来适应视图想要呈现的内容。如果视图试图解析某个视图模型上下文中的项目,它应该异步加载该项目,为其创建一个新的视图模型并将其作为子视图模型添加到 datacontext-vm。

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

4

1 回答 1

0

您的观察是正确的,self.resolve每当您尝试设置时都会调用它obs,以下内容来自淘汰赛文档

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

我不知道您使用self.resolvefunction with的原因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".

于 2013-07-02T16:57:39.333 回答