发布绑定到子视图

时间:2014-01-09 17:24:46

标签: knockout.js requirejs durandal

这可能是最简单的问题,但我很难过,以前找不到其他人遇到过这个问题的地方;需要帮助在shell.html中显示标题。

此时,我只是想让它发挥作用,所以一切都尽可能简单。

我的视觉元素由index.cshtml组成,它有一个名为' applicationHost'的div。我能够通过以下方式成功将shell.html加载到该div中:

`app.setRoot('viewmodels/shell', 'entrance');`

这是驻留在main.js中的一行代码,使用以下命令从index.cshtml调用:

`<script data-main="App/main" src="/scripts/require.js"></script>`

在shell.html中,我有一个div,它应该显示header.html。 shell.html中的div定义为:

`<div id="shellHeader" data-bind="compose:{ model: 'viewmodels/header' }">`

header.html很简单:     <div>
<span id="someSpan" data-bind="text: title"></span>
</div>

反过来,header.js定义为:     var header = (function () { var title = 'what I want to display in the someSpan div'; var header = { title: title }; return header; })();

当我运行应用时,我没有收到任何错误,而#applicationHost确实加载了shell.html,如Chrome开发者工具中的Elements标签所示:
    <div id="applicationHost"> <div class="durandal-wrapper" data-view="views/shell" data-active-view="true"> </div> <div id="shellHeader" data-bind="compose:{ model: 'viewmodels/header' }"> </div>
</div>

#shellHeader中没有显示任何内容。如果我使用注释语法,则同样如此:     <!-- ko compose: { viewmodel: 'header' } --> <!-- /ko -->

(或者如果我将上述评论改为:     <!-- ko compose: { model: 'viewmodels/header' } --> <!-- /ko -->     ,仍然没有显示,但在控制台中也没有错误信息)

但是,如果我将viewmodel更改为view,我确实会加载header.html,但会出现错误,指出&#39; title&#39;未定义,我将其解释为表示header.js文件未包含在呈现的元素中 - 我相信没有创建支持模块的视图已创建并插入到#shellHeader元素中。

如果我将以下行添加到header.js:     ko.applyBindings(header);

到文件的末尾,我收到一条错误消息,说明(效果不明确)你不能应用多个绑定......

我已经看到路由器对象用于渲染模型的位置,但我不认为这适用于此处。我只是尝试在cshtml对象中的html对象中加载一个html对象,并绑定到通过header.js模块公开的属性(在本例中)。

这似乎应该是世界上最简单的事情,但我无法弄明白。我错过了什么?提前感谢您的时间!

回答了一个问题,但提出了另一个问题:

对于遇到类似问题的其他人,我认为答案是header.html实际绑定的上下文(回想起来,我的问题是绑定到header.js上下文,而不是到shell.html的上下文)。

我通过添加&#39;标题来解决问题。 shell.js返回对象的属性,并将此注释用于shell.html中的绑定:

<!-- ko compose: {view: header } -->
<!-- /ko -->

因此,故事的寓意似乎是header.html视图绑定到其父级shell.html的上下文,而THAT上下文是header.html中必须绑定的属性。

现在的问题是,如何绑定header.js上下文对象而不是shell的上下文?

1 个答案:

答案 0 :(得分:0)

如果您想将标题视图模型和视图结合在一起,我相信您只想这样做:

ko compose: 'header'

或者路径与您指定的路径略有不同:

ko compose: { model: 'foo', view: 'bar/foo' }