使用Marionette/Backbone并无法传递App对象以触发自定义事件。在requirejs +木偶应用程序中传递应用程序对象
具体来说,requirejs会抛出以下内容:“错误:模块名称”应用程序“尚未加载上下文:_”。
编辑:违规代码是“var App = require('app');”在appController.js中。
从我读过的内容来看,该消息指的是循环引用或脚本尚未加载。我应该如何构造我的代码以避免这种情况?
注1:目前,我没有使用r.js.我确实有一个咕噜的构建过程,但没有机会设置r.js.只有在提及时才会缓解我的问题。
注2:我不使用Marionette的库存模块,因为我想学习requirejs。
在此先感谢。
//config.js
require.config({
paths: {
jquery: '../jquery',
bootstrap: '../bootstrap',
underscore: '../lodash',
backbone: '../backbone',
'backbone.babysitter': '../backbone.babysitter',
'backbone.wreqr': '../backbone.wreqr',
marionette: '../backbone.marionette',
text: '../text'
},
enforceDefine: true,
shim: {
'bootstrap': {
deps: ['jquery'],
exports: '$'
},
}
});
define(
['app', 'jquery', 'underscore', 'backbone', 'marionette', 'bootstrap'],
function(App, $, _, Backbone, Marionette) {
App.start();
}
);
//app.js
define(function(require) {
var Marionette = require('marionette'),
// and AppRouter, AppController
var app = new Marionette.Application();
app.addInitializer(function() {
var router = new AppRouter({
controller: AppController
});
});
app.on('start', function() {
Backbone.history.start();
});
app.vent.on('custom:event', function(a) {
console.log('caught custom:event, received: ' + a);
});
return app;
});
// appRouter.js
define(function(require) {
var Marionette = require('marionette');
return Marionette.AppRouter.extend({
appRouter: {
'': 'main'
}
});
});
//appController.js
define(function(require) {
return {
main: function() {
var App = require('app');
App.vent.trigger('custom:event', ['test']);
}
}
});
更新:
当然张贴这个问题后,我找到一个可行的解决方案。如果我将appController.js调整为以下内容,则无任何问题。尽管如此,解决方案并不合适。我是否需要为每条路线复制它?
//appController.js (version 2)
define(function(require) {
return {
main: function() {
require(['app'], function(app) {
app.vent.trigger('custom:event', ['test']);
});
}
}
});
更新2
如果有人好奇,这是我得到了它与Backbone.Wreqr工作(谢谢@arisalexis)。只显示从上面的代码更改的文件。
//app.js
define(function(require) {
var Marionette = require('marionette'),
Wreqr = require('backbone.wreqr'),
// and AppRouter, AppController
var app = new Marionette.Application();
app.addInitializer(function() {
var router = new AppRouter({
controller: AppController
});
});
app.on('start', function() {
Backbone.history.start();
});
// Get hook to global channel and listen for events!
var channel = Wreqr.radio.channel('global');
channel.vent.on('custom:event', function(a) {
console.log('caught custom:event, received: ' + a);
});
return app;
});
//appController.js
define(function(require) {
var Wreqr = require('backbone.wreqr');
var channel = Wreqr.radio.channel('global');
return {
main: function() {
channel.vent.trigger('custom:event', 'test');
}
}
});
注意,一般来说,路由器的控制器不应该有任何逻辑。这个问题中提出的代码是一个概念证明。
你可以张贴'requirejs的配置的paths'?我想你没有在那里声明'app'。 – 2014-10-31 21:35:45
增加了路径和垫片的实际内容(注意,我发现我并不需要骨架或木偶的垫片)。正如你所说,我没有在“路径”的应用程序。我认为requirejs知道要在baseUrl中查找它?事实上,它正在被加载。如果我注释掉“var App = require('app');”在appController.js中,应用程序按预期加载。 – jbarreiros 2014-10-31 21:41:39
您需要将'app'的路径添加到'paths'。然后你可以使用第一版。注释'var App = require('app');'后没有破坏你的代码,这意味着它被加载到别处并在全局声明。 – 2014-11-01 09:45:11