【问题标题】:How to create an instance of a module and pass it to another with requirejs?如何创建一个模块的实例并使用 requirejs 将其传递给另一个?
【发布时间】:2012-05-11 08:20:16
【问题描述】:

我正在使用 Backbone 和 Requirejs 构建单页应用程序。

现在我一直在从我的模块文件中返回一个新实例,以:

 return new moduleName;

这工作正常,直到我不得不将参数传递给集合的初始化方法。由于在创建实例时会调用初始化,因此我将“new”从 return 语句中删除。

return mymoduleName;

并在我的路由器中使用参数实例化集合:

myCollection = new library({paramname: "value"});

这确实创建了一个“库”的实例——一个在我的路由器的定义块中引入的集合,但是我如何将它传递给负责渲染它的视图?

我的视图类在它的定义块中具有相同的依赖关系,在它的初始化中我将它绑定到集合的重置:

this.collection = library;
_.bindAll(this, 'render');
this.collection.bind('reset', this.render);

这在从集合类中删除“新”之前有效(回顾起来根本没有意义!)但是现在视图永远不会被渲染,因为它是在路由器中实例化的 - 我如何将同一个实例传递给风景?

【问题讨论】:

    标签: backbone.js requirejs


    【解决方案1】:

    不要在其初始化方法中设置集合,而是在您实例化视图的任何位置(在您的情况下为路由器)。

    var myCollection = new library({paramname: "value"});
    var myView = new myCustomView({ 
        collection: myCollection 
    });
    

    如果myCollection 是一个你需要从其他地方访问的变量,你可以在路由器上设置它(myRouter.myCollection = ...),你可以创建一个保存全局对象的模型(MyAppGlobals)或者你可以只需要一个全局变量(不推荐)。

    【讨论】:

    • 谢谢,同时我让它与以下内容一起工作 - 不完全确定这是否真的是你所说的: library = new library({paramname: "value"}); myView = new view({collection: library});然后,在视图的初始化中: 初始化:function(opts){ this.collection = opts.collection; }
    • 所以基本上,我对“不要在初始化中设置集合”有点困惑——这不是处理构造函数参数的地方吗?
    • 无需在初始化时执行 'this.collection = opts.collection',如果您查看 Backbone 文档,它会说“创建新视图时,您传递的选项将附加到视图作为 this.options,以供将来参考。有几个特殊选项,如果通过,将直接附加到视图:模型、集合、el、id、className、tagName 和属性。 (documentcloud.github.com/backbone/#View-constructor)
    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2023-01-25
    • 2013-01-16
    • 2015-03-22
    • 1970-01-01
    • 2016-08-27
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多