这可能是最简单的问题,但我很难过,以前找不到其他人遇到过这个问题的地方;需要帮助在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的上下文?
答案 0 :(得分:0)
如果您想将标题视图模型和视图结合在一起,我相信您只想这样做:
ko compose: 'header'
或者路径与您指定的路径略有不同:
ko compose: { model: 'foo', view: 'bar/foo' }