2014-10-31 16 views
0

使用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'); 
     } 
    } 
}); 

注意,一般来说,路由器的控制器不应该有任何逻辑。这个问题中提出的代码是一个概念证明。

+0

你可以张贴'requirejs的配置的paths'?我想你没有在那里声明'app'。 – 2014-10-31 21:35:45

+0

增加了路径和垫片的实际内容(注意,我发现我并不需要骨架或木偶的垫片)。正如你所说,我没有在“路径”的应用程序。我认为requirejs知道要在baseUrl中查找它?事实上,它正在被加载。如果我注释掉“var App = require('app');”在appController.js中,应用程序按预期加载。 – jbarreiros 2014-10-31 21:41:39

+0

您需要将'app'的路径添加到'paths'。然后你可以使用第一版。注释'var App = require('app');'后没有破坏你的代码,这意味着它被加载到别处并在全局声明。 – 2014-11-01 09:45:11

回答

2

我有同样的问题,解决不了了,幸运的是,因为它会在版本3

被弃用从文档:

从其他对象的应用程序,你是内访问该应用频道鼓励通过Wreqr API而不是应用程序实例本身来处理系统。

var globalCh = Backbone.Wreqr.radio.channel('global'); 
globalCh.vent; 

使用本或看看https://github.com/marionettejs/backbone.radio

+0

谢谢@arisalexis。这是我需要的提示。 – jbarreiros 2014-11-03 06:41:19

相关问题