DOM 结构如下:
//shell.html
<div id="applicationContentWrapper" >
<!-- ko compose: {model: 'viewmodels/header', activate:true} --> <!-- /ko -->
<div data-bind="router:{}"></div>
</div>
这是我的路由器配置片段
router.map([
{ route: '', moduleId: 'viewmodels/dashboard', name: 'dashboard'},
{ route: 'form', moduleId: 'viewmodels/form', name: 'form'},
{ route: 'login', moduleId: 'viewmodels/login', name: 'login'}
]);
正如您所见,我的登录视图被插入<div data-bind="router:{}"></div>
这是预期的行为。但如果我在登录视图中,我需要隐藏标题视图,我已通过订阅标头视图模型中的路由器配置来设置该视图:
router.activeInstruction.subscribe(function (val) {
val.config.name === "login" ? showHeader(false) : showHeader(true);
});
但是这感觉有点乱,标题视图的 DOM 仍在页面中,我真正想要做的就是如果我在登录视图我只希望登录视图的 DOM 就像我在单独的页面中一样只有登录视图。但到目前为止,我还没有找到一个干净的方法来做到这一点。
答案 0 :(得分:2)
一些事情:
with
或if
- 绑定。如果病情是假的,他们会隐藏内心的任何内容。我可以理解你想要一个完全不同的'布局'而没有其他DOM用于登录视图的理由。但这违背了单页应用程序的整体想法。这也是不必要的。一些智能css和数据绑定(可见,if,with)将为您提供相同的结果,通常提供比完整页面重新加载更好的用户体验。如果您坚持打破SPA,请将路由器放低一级:例如主路由器只知道登录路由和内部路由。内部路由有另一个路由器,其中包含所有其他页面。这样,您就可以将常用HTML从shell视图移动到内部视图。