【问题标题】:Static module declaration using Durandal and Require使用 Durandal 和 Require 的静态模块声明
【发布时间】:2013-10-07 22:22:09
【问题描述】:

我正在为我的 SPA 应用程序使用 Durandal 和 Require。我也在使用 John Papa 的 HotTowel 模板。

对于我的模块,我需要根据请求创建其中一些模块,而其中一些模块需要是单例的。

define([], function(){
    var bookId = ko.observable();
    var bookName = ko.observable();

    return {
        bookId: bookId,
        bookName: bookName
    };
}

上述模块似乎为每个组合使用返回一个新实例,例如:

compose: {model: 'viewmodels/book'}

但是,如果我希望视图模型在所有合成中都相同,该怎么办。例如,我想要一个名为 loginInfo 的登录视图模型,它将在很多地方使用,因此它不应该在每个组合上初始化,因为它是在第一次登录时在某个地方启动的。

compose: {model: 'viewmodels/loginInfo'}

【问题讨论】:

  • 上述模块确实返回了一个单例,参见durandaljs.com/documentation/Creating-A-Module。是什么让你相信它不是?
  • 确实,它唯一会返回新内容的时候是当你返回一个构造函数时。
  • @RainerAtSpirit,看来你是对的。这是我的错。
  • @MatthewJamesDavis 因为我是 javascript 世界的新手,所以我混淆了这些概念。问题是我在RequireJs中想,如果我们返回函数就意味着它是一个构造函数,如果我们返回一个对象,它就是一个单例对象!
  • @MatthewJamesDavis 你不想发布答案吗!?所以我可以在这个问题解决后关闭它!?

标签: javascript requirejs single-page-application durandal hottowel


【解决方案1】:

在 Durandal 中,如果视图模型返回一个对象

define(function(require) {
    return { a: 1, b: 2 }
});

Durandal 将持久化同一个对象。如果视图模型返回构造函数

define(function(require) {
    return Function() {
        this.a = 1;
        this.b = 2;
    }
});

Durandal 将通过调用构造函数创建一个新对象。

【讨论】:

  • 感谢您简短而完整的回答。
  • 如果使用 TypeScript,这正是大问题。什么是“导出”-ed 是一个构造函数——因此视图模型总是在视图被激活时被初始化。当然,我可以直接在模块级别使用导出,但在我看来,这对“旧”js 对象表示法没有任何改进。有没有办法告诉 Durandal 只使用一个视图模型实例?
  • @okieh 您必须导出对象而不是函数(如上面的答案中所述)。你不能在 TypeScript 中做类似export new ClassName(); 的事情吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2011-05-04
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多