Javascript 从App.router.method中访问App.method
我正在构建一个backbone.js+require.js应用程序,我遇到了以下问题。要构建我的应用程序,我有一个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
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.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')
延迟到一段时间后(即在稍后调用的函数中等),它将正常工作。谢谢!我想我会用这个作为解决办法。根据您的回答,我发现从路由触发事件并使用这些事件在应用程序的其他地方生成视图更为简洁。如果我把所有视图生成逻辑都塞进路由中,事情可能会变得有点混乱。