我有这样的观点:
<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。
我在其他地方看到过这种异步可观察模式,但我似乎错误地使用了它。
答案 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"
。