这是我的shell.html
定义了一个导航栏,几乎直接从导管上抬起。
<div>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<ul class="nav" data-bind="foreach: router.navigationModel">
<li data-bind="css: { active: isActive }">
<a data-bind="attr: { href: hash }"><span><i data-bind="attr: { class: glyph }"></i> <span data-bind="text: title"></span></span></a>
</li>
</ul>
<span class="nav">
Welcome <span data-bind="text: app.user.name()"></span>
</span>
<div class="loader pull-right" data-bind="css: { active: router.isNavigating }">
<i class="icon-spinner icon-2x icon-spin"></i>
</div>
</div>
</div>
<div class="container-fluid page-host" data-bind="router: { transition:'entrance' }"></div>
</div>
这是问题部分:
<span data-bind="text: app.user.name()"></span>
user
是我在app
创建后立即添加的属性。它由用于登录和注销的视图模型更新。
要使绑定工作,我需要将对象放入视图模型的范围内。通常我会这样做:var app = require('durandal/app');
。在大多数视图模型中,这没有问题。但是当我在shell.js中执行此操作时,视图管理会变得非常混乱。
我要做的就是删除某个应用状态以指示用户当前是否已登录。
有两种可能的解决方案
我确信这对老手来说是微不足道的;我在等待你的智慧。搜索谷歌效果不佳,因为“app”的搜索范围过于宽泛。
我通过将用户添加到文档而不是应用程序来避开问题,但这很可怕。我很想知道这样做的正确方法。
有趣的是,HTML5浏览器定义sessionStorage
的目的完全是我污染document
的目的。如果你在启动代码中执行此操作
if (typeof(document.sessionStorage) == undefined) document.sessionStorage = {};
然后你可以假设它存在于你的应用程序的其余部分。 我们无法在浏览器支持上计算,但不难检查并在必要时创建它。如果你查看sessionStorage,你会看到一个警告,说明在下一页加载时内容会丢失,但在SPA中根本不会丢失。
答案 0 :(得分:1)
实现这一目标的一种方法(最可能是正确的方法)将使用Session Data with Durandal中讨论的共享AMD模块。
答案 1 :(得分:0)
我们在Durandal应用程序中所做的是创建一个名为config
的独立静态模块,其中包含一个名为userName
的可观察属性。
在模块的顶部(在本例中为shell.js文件),输入以下内容:
define([
'durandal/system',
'durandal/activator',
'plugins/router',
'durandal/app',
...
'config'
],
function(system, activator, router, app,..., config) {
}
);
config
模块应该是静态的,这意味着它应该返回一个对象文字而不是构造函数。
您的config
模块可能看起来像这样(裸骨):
define('config', ['knockout'],
function(ko) {
var userName = ko.observable('');
return {
userName: userName
};
}
);