Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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 从App.router.method中访问App.method_Javascript_Backbone.js_Requirejs_Circular Dependency - Fatal编程技术网

Javascript 从App.router.method中访问App.method

Javascript 从App.router.method中访问App.method,javascript,backbone.js,requirejs,circular-dependency,Javascript,Backbone.js,Requirejs,Circular Dependency,我正在构建一个backbone.js+require.js应用程序,我遇到了以下问题。要构建我的应用程序,我有一个App.js文件,该文件包含以下内容: define(function(require) { 'use strict'; var _ = require('underscore'), Backbone = require('backbone'), Router = require('router'), ModuleMa

我正在构建一个backbone.js+require.js应用程序,我遇到了以下问题。要构建我的应用程序,我有一个
App.js
文件,该文件包含以下内容:

define(function(require) {
    'use strict';

    var _ = require('underscore'),
        Backbone = require('backbone'),
        Router = require('router'),
        ModuleManager= require('moduleManager');

    var App = function App() {
        var base = {
            router: new Router(),
            moduleManager: new ModuleManager(),
            start: function start(){
                Backbone.history.start({pushState: true});
                this.router.navigate('home', {trigger: true}); 
            }   
        };
        return _.extend(
            base, 
            Backbone.events
        );
    };

    return App;

});
应用程序以
window.myApp=new App()启动
,然后
myApp.start()

router.js
的内容如下:

define(function(require) {
    'use strict';

    var _ = require('underscore'),
        Backbone = require('backbone');

    var Router = Backbone.Router.extend({
        routes: {'home': 'home'},
        home: function home() { 
            // MY ISSUE IS HERE
            App.moduleManager.add('moduleName');
        }       
    });

    return Router;
});
moduleManager
是一个实用函数/对象,用于:

  • 通过要求require.js文件(主干视图+集合),通过App.moduleManager.add('module')
添加应用程序模块
  • 进行一些检查(例如,确保模块不存在)
  • 将模块集中存储在App.moduleManager.modules中
  • 除以下几点外,一切正常: 如何从
    App.router.home
    或任何其他路由(
    App.router.xyz
    )中调用
    App.moduleManager

    • App.router.home
      中,
      不能引用
      App
      (?)
    • router.js
      中,我不能调用
      App=require('App')
      ,因为我将在
      App.js
      router.js之间进行转换

    我不确定我是否有一个全局应用程序结构问题,或者是否只有一个简单的语言结构可以解决这个问题。感谢您提供的帮助。

    您可以在路由器的构造函数中传递所需的对象

    但我建议使用事件。在路由中,触发一个事件,然后在应用程序中侦听该事件。这使得路由器只需执行一项作业,即可响应来自浏览器的路由更改(后退/前进单击)

    在路由器中:

    home: function() { 
        Backbone.trigger('home:show');
    }  
    
    应用程序内:

    start: function(){
        Backbone.history.start({pushState: true});
        Backbone.on('home:show', this.showHome, this);
    },  
    
    showHome: function(){
        this.router.navigate('home', {trigger: false}); // just update, dont trigger route
        this.moduleManager.add('moduleName');
    }
    
    现在,如果您想更改应用程序在代码中显示的内容,您只需触发此事件,而无需在路由器上调用
    navigate

    其他一些代码,可能是菜单视图:

    homeClicked: function(){
        Backbone.trigger('home:show');
    }
    

    这将显示您的主视图,并更新历史记录。

    有保证的循环依赖关系没有问题。使用
    require('app')
    我的问题在这里时
    将正确解决。你的意思是如果我将
    app
    的引用存储为
    Router.app=require('app')
    ,我就可以从
    Router.home
    中执行类似
    this.app.moduleManager
    的操作吗?如果你这样做了
    Router.app=require('app>)
    define()
    本身中,您将得到
    未定义的
    ,因为它是一个循环依赖项。但是,如果您将
    require('app')
    延迟到一段时间后(即在稍后调用的函数中等),它将正常工作。谢谢!我想我会用这个作为解决办法。根据您的回答,我发现从路由触发事件并使用这些事件在应用程序的其他地方生成视图更为简洁。如果我把所有视图生成逻辑都塞进路由中,事情可能会变得有点混乱。