如果有三个对象:
有没有办法使用:
window.app = {}; //--> global
var curDate = app.appState.curDate;
var curCategory = app.appState.curCategory;
var curBounds = app.appState.curBounds;
我不太喜欢使用全局变量,即使它们是命名空间的,因为用户可以直接从浏览器访问这些变量并拧紧界面。
后端仍然是安全的,但不知何故感觉不对。
但似乎没有一种可行的替代方法可以从控制器D访问这两个变量。
我已经注意到如何传递参数并使其适合可能会变得非常麻烦,并且它似乎不是很容易维护。
编辑:结构有点像这样:
App ---> app_dates ---> datesController (trigger date change event fom view)
---> app_categories ---> categoryController (trigger category change from view)
---> app_map ---> mapController (trigger map bounds change from Google map)
---> app_home ---> Listen to the events, send a request to the server with above parameters)
答案 0 :(得分:0)
即使在雅虎,他们也只使用一个全局变量 http://yuiblog.com/blog/2006/06/01/global-domination/
我觉得对于特定用例(需要从应用程序中的所有部分访问的模块对象/变量),可以使用全局窗口而不是传递参数。
就我而言,我认为创建一种“config”对象,将全局引导到名称空间并在应用程序启动时分配默认值是很有用的。
答案 1 :(得分:0)
尝试requireJS,其中一个requireJS目的是不污染全局范围 在requireJS中,您可以将状态对象定义如下
define('appState', [],function(){
return {
curDate: null,
curCategory: null,
curBounds: null,
};
});
现在对于任何需要或修改app状态的模块,它只会将appState作为依赖项添加,它将作为参数而不是全局变量传递,如下所示
define('datesController',['appState'],function(appState){
var datesController = Backbone.View.extend({
events:{
'change #date': 'dateChanged'
}
dateChanged: function(){/*here you can access appState and modify it*/},
});
return datesController;
});
然后,只要你需要创建datesController对象,你只需要
require('datesController', function(datesController){
var datesControllerObj = new datesController({});
});
这段代码是关于requireJS的简要介绍,你可以参考下面的教程
http://javascriptplayground.com/blog/2012/07/requirejs-amd-tutorial-introduction/