全局命名空间变量:任何替代方案?

时间:2014-09-13 20:53:03

标签: javascript backbone.js

如果有三个对象:

  • 对象A触发事件,传递'date'参数;
  • 对象B触发事件,传递'category'参数;
  • 对象C触发一个事件,传递一个谷歌地图'bounds'参数;
  • 对象D侦听事件A,B和C,执行单个函数,该函数需要A(日期),B(类别)和C(映射边界)的当前状态。

有没有办法使用:

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) 

2 个答案:

答案 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/