Javascript 使用Durandal和Require的静态模块声明

Javascript 使用Durandal和Require的静态模块声明,javascript,requirejs,single-page-application,durandal,hottowel,Javascript,Requirejs,Single Page Application,Durandal,Hottowel,我正在使用Durandal并需要我的水疗应用程序。我也在使用约翰·帕帕的热毛巾模板 对于我的模块,我需要根据请求创建一些模块,并且其中一些模块是单例模块 define([], function(){ var bookId = ko.observable(); var bookName = ko.observable(); return { bookId: bookId, bookName: bookName }; } 上述模块似

我正在使用Durandal并需要我的水疗应用程序。我也在使用约翰·帕帕的热毛巾模板

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

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

    return {
        bookId: bookId,
        bookName: bookName
    };
}
上述模块似乎为每个组合使用返回了一个新实例,如:

compose: {model: 'viewmodels/book'}
但是,如果我希望视图模型在所有组合中都相同,该怎么办呢。例如,我想为我的登录名创建一个名为
loginInfo
的viewmodel,它将在很多地方使用,因此它不应该在每个组合上初始化,因为它是在第一次登录时在某处启动的

compose: {model: 'viewmodels/loginInfo'}

在Durandal中,如果viewmodel返回一个对象

define(function(require) {
    return { a: 1, b: 2 }
});
Durandal将保留同一对象。如果viewmodel返回构造函数

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

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

上面的模块确实返回了一个singleton see。是什么让你相信它不会呢?事实上,它唯一会返回新内容的时候是当你返回一个构造函数时。@RainerAtSpirit,看起来你是对的。这是我的错。@MatthewJamesDavis因为我是javascript世界的新手,所以我混淆了这些概念。问题是,我认为在RequireJs中,如果我们返回函数,就意味着它是一个构造函数,如果我们返回一个对象,它就是一个单例对象@马修斯·詹姆斯戴维斯:你不想公布答案吗!?这样我就可以解决这个问题了!?谢谢你简短而完整的回答。如果使用打字脚本,这确实是一个大问题。什么是“导出”-ed是一个构造函数-因此视图模型总是在激活视图时初始化。当然,我可以直接在模块级使用导出,但在我看来,与“旧”js对象表示法相比,这并没有什么改进。有没有办法告诉Durandal只使用一个viewmodel实例?@okieh您必须导出一个对象而不是一个函数(如上面的答案所述)。您不能执行类似于导出新类名()的操作吗在TypeScript中?