【问题标题】:Accessing data from containing view model从包含视图模型访问数据
【发布时间】:2013-09-10 11:15:16
【问题描述】:

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

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

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

而“articleSection”只是一个包含字符串的可观察对象:

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

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

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

var articleSelected = ko.observable(true);

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

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

<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,但都不起作用。我是否必须“要求”子视图中的父视图模型才能正常工作?

【问题讨论】:

    标签: knockout.js requirejs durandal


    【解决方案1】:

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

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

    来自documentation(重点由我添加):

    每当组合发生时,都会围绕组合视图和视图模型创建一个独立的绑定上下文。因此,从该视图内部,您无法从外部访问其他模型对象。我们相信这对于封装非常重要,因为我们已经看到当您可以“意外”引用范围之外的事物时,会发生一些非常糟糕的架构事情。结果,默认情况下会封装事物。如果您愿意,您可以在绑定上设置 preserveContext:true 以将新组合“连接”到其父组合并启用从子组合内部向上遍历树,但这不是默认设置。

    【讨论】:

    • 谢谢。我在撰写绑定上做了preservecontext=true 位并尝试访问$parent.articleSelected,但它仍然在控制台窗口中显示$parent is not defined,所以我还没有意识到这一点,抱歉!
    • @CarlEdwards 抱歉 preservecontext 的语法在我的回答中是错误的。请立即查看我的更新答案!
    • 我怀疑这可以正常工作,但对于我之前遇到的问题。一旦我为 compose 绑定指定了一个对象,Durandal 决定去奇怪的地方寻找视图和视图模型,这一切都中断了。我现在得到:GET http://localhost:5907/App/views/viewmodels/lt_articleRead.html 404 (Not Found),因为它在App/views 而不是/App/views/viewmodels,这是 Durandal 出于某种原因正在寻找的地方!
    • 你能用ko.observable('lt_articleRead')试试吗?所以没有viewmodels?顺便问一下,您使用的是哪个 durandal 版本?
    • 天哪,我真是个智障,居然没看到!抱歉...我使用的是 2.0 版。我现在回到“$parent is not defined”错误:Unable to parse bindings. Bindings value: visible: $parent.articleSelected() Message: $parent is not defined; View: views/lt_articleRead; ModuleId: viewmodels/labTool
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2016-08-11
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多