2012-07-08 47 views
5

我不确定如何在模块化(RequireJs)Backbone环境中使用命名空间。如何在Requirebone中使用Backbone中的命名空间

我已经想了一下它如何可能看起来像但我完全不确定这是否是正确的方式。

app.js(过得去main.js执行)

define('App', ['underscore', 'backbone', 'Router'], function(_, Backbone, Router){ 
    function initialize(){ 
     var app = {}; // app is the global namespace variable, every module exists in app 

     app.router = new Router(); // router gets registered 

     Backbone.history.start(); 
    } 

    return { initialize: initialize } 
}); 

messages.js

define('MessageModel', ['underscore', 'backbone', 'App'], function(_, Backbone, App){ 
    App.Message.Model; // registering the Message namespace with the Model class 

    App.Message.Model = Backbone.Model.extend({ 
     // the backbone stuff 
    }); 

    return App; 
}); 

这是正确的做法或完全是我的错误的方式(如果是,请纠正我!)

回答

5

看看TODO Backbone + requireJs示例:

https://github.com/addyosmani/todomvc

+0

嗨,我查看了代码。这是我目前使用RequireJs的方式,但是我错过了命名空间(总是有另一个变量没有“全局”之一) – 2012-07-08 09:25:10

+0

链接不再工作:(任何想法在哪里检索该资源? – lucke84 2013-01-21 17:35:59

+1

http://addyosmani.github.com/todomvc/dependency-examples/backbone_require/ – 2013-01-21 17:40:02

1

我是新来的骨干,以测试它,但刚读来自requirejs文档的片段。

模块不同于传统的脚本文件,因为它定义了一个良好范围的对象,避免污染全局名称空间。它可以显式地列出它的依赖关系,并获得这些依赖关系的句柄,而不需要引用全局对象,而是接收依赖关系作为定义模块的函数的参数。 RequireJS中的模块是模块模式的扩展,其优点是不需要全局变量来引用其他模块。

对我来说,听起来好像在使用requirejs时,你可以忘记所有关于命名空间的事情,就像requirejs处理它一样。您只需以不同的方式访问它。当你想从另一个模块访问它时,你需要在你的依赖关系数组中放置一个文件路径,并将相应的变量提供给以下函数。

define(["folder/a-script", "folder/another-script"], function(AScript, AnotherScript) { 
     // In here the scripts are loaded and can be used, but are called by 
     // their relative name in the anonymous function. 
    } 
); 

不管怎样,也许在某些情况下,仍有必要命名空间的东西,但我认为在一般情况下,它的价值reading the docs看到,如果你需要。