这是我的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中这样做时,视图管理就会变得非常糟糕。
我所要做的就是找出某个应用程序状态,以指示用户当前是否已登录。
有两种可能的解决方案
我相信这对老手来说是微不足道的,我等待着你的智慧。搜索谷歌并不是很好,因为“应用程序”这个搜索词太宽泛了。
我避开了这个问题,把用户塞到文档上而不是应用程序上,但这太可怕了。我只听着正确的方法。
有趣的是,HTML5浏览器定义sessionStorage正是为了我污染document的目的。如果在引导代码中这样做
if (typeof(document.sessionStorage) == undefined) document.sessionStorage = {};然后,您可以假设它存在于您的应用程序的其余部分。我们不能指望浏览器支持,但这并不难检查,如果必要的话,创建它。如果您查找sessionStorage,您将看到一个警告,即在下一个页面加载时内容将丢失,但是在SPA中,这一点都不重要。
发布于 2014-03-05 21:07:37
我们在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
};
}
);发布于 2014-03-05 21:05:24
实现这一目标的一种方法(最可能是正确的)是使用Session Data with Durandal中讨论的共享的AMD模块。
https://stackoverflow.com/questions/22196841
复制相似问题