2013-03-25 73 views
5

我是Require.js的新手,我正在尝试做一些我认为很简单但却开始变得痛苦的事情。使用Require.js和Backbone定义全局应用程序命名空间

我想为我的Backbone应用程序定义一个全局命名空间,并将其作为模块加载。这里是我的命名空间(main.js):

define(
['jquery', 
    'underscore', 
    'backbone', 
    'GlobalRouter' 
], 
function($, _, Backbone) { 
var App= { 
    Models: {}, 
    Views: {}, 
    Collections: {}, 
    Routers: {}, 
    init: function() { 
     new App.Routers.GlobalRouter(); 
     Backbone.history.start(); 
    } 
} 
return App; 

}); 

,这里是我的config.js文件:

require.config({ 
// your configuration key/values here 
baseUrl: "js", // generally the same directory as the script used in a data-main attribute for the top level script 
paths: { 
    'jquery' : '//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min', 
    'underscore': 'vendor/underscore-min', 
    'backbone': 'vendor/backbone-min', 
    'marionette': 'vendor/backbone.marionette', 
    'main' : 'main' 
}, // set up custom paths to libraries, or paths to RequireJS plugins 
shim: { 
    'underscore': { 
     exports: '_' 
    }, 

    'backbone': { 
     deps: ['underscore', 'jquery'], 
     exports: 'Backbone' 
    }, 

    'main' : { 
     deps: ['underscore', 'jquery', 'backbone', 'GlobalRouter'], 
     exports: 'TEWC' 
    } 

} // used for setting up all Shims (see below for more detail) 
}); 

define([ 
'jquery', 
    'underscore', 
    'backbone', 
    'main' 
], 
function($, _, Backbone, App, GlobalRouter) { 
console.log(App) 
alert('hit ') 
    $(function() { 
     App.init(); 
    }); 
} 

);

和良好的措施,这是我的路由器:

define([ 
'jquery', 
'underscore', 
'backbone', 
'main' 
], 
function($, _, Backbone, TEWC) { 

TEWC.Routers.GlobalRouter = Backbone.Router.extend({ 
    routes: { 
     "" : "index", 
     "documents/:id" : "edit", 
     "login" : "login" 
    }, 

    edit: function(id) { 
     alert('edit') 
    }, 

    index: function() { 
     alert('index') 
    }, 

    login: function() { 
     alert('login') 
    } 
}); 

}); 

在过去,我得到一个“应用程序是未定义的错误”。现在,我得到一个负载超时错误几分钟后这样说:

Uncaught Error: Load timeout for modules: main 

但是,警报不火,而main.js似乎没有得到加载,但我相信做路由器,并且它并不吠叫TEWC是未定义的 - 所以它可能正在加载,即使它不在我的网络标签中?

这可能是一个菜鸟问题 - 有没有人有这方面的见解?

回答

2

下面的代码没有定义GlobalRouter但它得到的传递给定义回调

define([ 
'jquery', 
    'underscore', 
    'backbone', 
    'main' 
], 
function($, _, Backbone, App, GlobalRouter) { 
console.log(App) 
alert('hit ') 
    $(function() { 
     App.init(); 
    }); 
} 

添加GlobalRouterdefine

其次,当它无法加载main ..can您从控制台检查什么它尝试访问的URL?它很可能是一个错误的配置。

+0

这是与Addy Osmani的TodoMVC结合在一起,并且需要(https://github.com/addyosmani/todomvc/tree/gh-pages/dependency-examples/backbone_require)才能发挥重要作用!谢谢! – streetlight 2013-03-25 13:05:38

+0

路灯:你能说出确切的问题是什么吗?我有类似的问题。 – 2013-03-28 08:24:33

+0

@JohnEdward,我相信我必须以AMD风格配置main.js,并具有定义函数等等。此外,确保您定义的文件的顺序也与函数参数中的顺序相匹配非常重要 - 我相信这是关键。这有帮助吗? – streetlight 2013-04-01 18:32:00

2

如果我没有弄错你的问题是config.js,在require.config()之后,你的define()应该是require()。

进一步解释。您目前有:

define([ 
'jquery', 
    'underscore', 
    'backbone', 
    'main' 
... 

define应该是一个require,因为这是你想要执行的代码;它不是一个模块定义。

这当然是前面提到的缺失的GlobalRouter依赖关系。