Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在requirejs+中传递应用程序对象;木偶应用_Javascript_Backbone.js_Requirejs_Marionette - Fatal编程技术网

Javascript 在requirejs+中传递应用程序对象;木偶应用

Javascript 在requirejs+中传递应用程序对象;木偶应用,javascript,backbone.js,requirejs,marionette,Javascript,Backbone.js,Requirejs,Marionette,使用木偶/主干网工作,并且在传递应用程序对象以触发自定义事件时遇到问题 具体地说,requirejs抛出以下内容:“错误:尚未为上下文加载模块名“app”: 编辑:有问题的代码是appController.js中的“var App=require('App');” 据我所知,该消息指的是循环引用或尚未加载的脚本。我应该如何构造代码以避免这种情况 注1:目前,我没有使用r.js。我确实有一个grunt构建过程,但还没有机会设置r.js。我只想提一下,以防我的问题得到缓解 注2:我没有使用木偶的股票

使用木偶/主干网工作,并且在传递应用程序对象以触发自定义事件时遇到问题

具体地说,requirejs抛出以下内容:“错误:尚未为上下文加载模块名“app”:

编辑:有问题的代码是appController.js中的“var App=require('App');”

据我所知,该消息指的是循环引用或尚未加载的脚本。我应该如何构造代码以避免这种情况

注1:目前,我没有使用r.js。我确实有一个grunt构建过程,但还没有机会设置r.js。我只想提一下,以防我的问题得到缓解

注2:我没有使用木偶的股票模块,因为我想学习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');
        }
    }
});

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

我也遇到了同样的问题,无法解决它,幸运的是,它将在版本3中被弃用

从文档中:

要从应用程序中的其他对象访问此应用程序通道,建议您通过Wreqr API而不是应用程序实例本身获取系统句柄

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

使用此选项或查看

您是否可以发布requirejs配置的路径?我猜你没有在那里声明
app
。添加了路径和垫片的实际内容(注意,我发现主干或木偶不需要垫片)。正如你所说,我在“路径”中没有应用程序。我以为requirejs知道在baseUrl中查找它?事实上,它正在加载。如果我在appController.js中注释掉“var App=require('App');”,应用程序将按预期加载。您需要将
App
的路径添加到
路径中。然后你可以使用第一版。注释
var-App=require('App')之后的事实
没有破坏您的代码,这意味着它已加载到其他位置并全局声明。添加了
应用程序的路径到
路径,但不幸的是,仍然收到相同的消息。注意,已检查Firebug,正在加载app.js(例如,非404'ing、500'ing等)。您能否在一些地方添加
调试器
,以检查文件的加载顺序?谢谢@arisalexis。这就是我需要的提示。