在shell.js中不能要求('durandal / app')

时间:2014-03-05 11:47:18

标签: durandal

这是我的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中执行此操作时,视图管理会变得非常混乱。

我要做的就是删除某个应用状态以指示用户当前是否已登录。

有两种可能的解决方案

  • 以某种方式将应用程序纳入范围
  • 以shell.js
  • 范围内的其他方式管理应用程序状态

我确信这对老手来说是微不足道的;我在等待你的智慧。搜索谷歌效果不佳,因为“app”的搜索范围过于宽泛。


我通过将用户添加到文档而不是应用程序来避开问题,但这很可怕。我很想知道这样做的正确方法。

有趣的是,HTML5浏览器定义sessionStorage的目的完全是我污染document的目的。如果你在启动代码中执行此操作

if (typeof(document.sessionStorage) == undefined) document.sessionStorage = {};

然后你可以假设它存在于你的应用程序的其余部分。 我们无法在浏览器支持上计算,但不难检查并在必要时创建它。如果你查看sessionStorage,你会看到一个警告,说明在下一页加载时内容会丢失,但在SPA中根本不会丢失。

2 个答案:

答案 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
        };
    }
);