首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在shell.js中要求(“durandal/app”)

不能在shell.js中要求(“durandal/app”)
EN

Stack Overflow用户
提问于 2014-03-05 11:47:18
回答 2查看 123关注 0票数 1

这是我的shell.html定义了一个肚脐,几乎是直接从管风管上提出来的。

代码语言:javascript
复制
<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>

这就是问题所在:

代码语言:javascript
复制
<span data-bind="text: app.user.name()"></span>

user是我在创建app之后添加到它的一个属性。它由用于登录和注销的视图模型更新。

为了使绑定正常工作,我需要将对象放到视图模型的作用域中。通常我会这样做:var app = require('durandal/app');。在大多数视图模型中,这不是问题。但是,当我在shell.js中这样做时,视图管理就会变得非常糟糕。

我所要做的就是找出某个应用程序状态,以指示用户当前是否已登录。

有两种可能的解决方案

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

我相信这对老手来说是微不足道的,我等待着你的智慧。搜索谷歌并不是很好,因为“应用程序”这个搜索词太宽泛了。

我避开了这个问题,把用户塞到文档上而不是应用程序上,但这太可怕了。我只听着正确的方法。

有趣的是,HTML5浏览器定义sessionStorage正是为了我污染document的目的。如果在引导代码中这样做

代码语言:javascript
复制
if (typeof(document.sessionStorage) == undefined) document.sessionStorage = {};

然后,您可以假设它存在于您的应用程序的其余部分。我们不能指望浏览器支持,但这并不难检查,如果必要的话,创建它。如果您查找sessionStorage,您将看到一个警告,即在下一个页面加载时内容将丢失,但是在SPA中,这一点都不重要。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-05 21:07:37

我们在Durandal应用程序中所做的是创建一个名为config的单独静态模块,该模块包含一个可观察的属性,名为userName

在模块顶部(本例中是shell.js文件),放置以下内容:

代码语言:javascript
复制
define([
        'durandal/system',
        'durandal/activator',
        'plugins/router',
        'durandal/app',
        ...
        'config'
    ],
    function(system, activator, router, app,..., config) {
    }
);

config模块应该是静态的,这意味着它应该返回一个对象文本,而不是构造函数。

您的config模块可能看起来像这样(基本原理):

代码语言:javascript
复制
define('config', ['knockout'],
    function(ko) {
        var userName = ko.observable('');

        return {
            userName: userName
        };
    }
);
票数 0
EN

Stack Overflow用户

发布于 2014-03-05 21:05:24

实现这一目标的一种方法(最可能是正确的)是使用Session Data with Durandal中讨论的共享的AMD模块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22196841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档