从包含视图模型访问数据

时间:2013-09-06 11:07:16

标签: knockout.js requirejs durandal

你知道它已经安静了很久,对吗? ; - )

我有一个主视图模型。在视图内部,我使用compose绑定来加载一个子视图,就其显示的数据而言,它是“独立的”。

<div data-bind="compose: articleSection"></div>

“articleSection”只是一个包含字符串的observable:

var articleSection = ko.observable('viewmodels/lt_articleRead');

...因为根据用户的操作,我可能希望在该div中加载不同的视图/模型。

在我的主视图模型中,我还有一个可观察的“articleSelected”:

var articleSelected = ko.observable(true);

...从列表中选择文章时设置。

在我的子视图(lt_ArticleRead)中,我有两个可以显示的div。如果articleSelected为false,则其中一个为true:

<div id="articleSelected" data-bind="visible: articleSelected()">
...
</div>
<div id="articleNotSelected" data-bind="visible: articleSelected()">
     <p>Please select an article from the list on the left or create a new one</p>
</div>

我尝试使用“$ root.articleSelected()”和“$ parent.articleSelected”从主视图模型访问observable,但都不起作用。我是否必须“要求”子视图中的父视图模型才能使其正常工作?

1 个答案:

答案 0 :(得分:5)

您需要在撰写绑定上设置preserveContext:true

<div data-bind="compose: { model: articleSection, preserveContext: true }"></div>

来自documentation(我强调):

  

每当组合发生时,就会在该组合视图和视图模型周围创建隔离的绑定上下文。因此,从该视图内部,您无法到达外部的其他模型对象。我们认为这对于封装非常重要,因为我们已经看到一些非常糟糕的架构事件发生在你可以“意外”引用范围之外的事情时。因此,默认情况下封装了一些东西。如果需要,您可以在绑定上设置preserveContext:true以将新合成“连接”到其父级并启用从子合成内部向上移动树,但这不是默认