【问题标题】:Handling global application state (not variables as such) in CommonJS projects (specifically Browserify)在 CommonJS 项目(特别是 Browserify)中处理全局应用程序状态(不是变量本身)
【发布时间】:2014-07-16 05:29:17
【问题描述】:

在 Backbone 项目中使用 Browserify,我只是想知道是否有人对如何处理全局状态有任何建议/指示。通过全局状态,我不一定指全局变量,而是指应用程序范围内的值,即。当前登录的用户、应用路由器(用于从视图导航)、事件对象(用于围绕应用进行通信)。

除了将这些东西传递给可能需要它们的每个视图/模块之外,还有更简单的方法吗?

如果我们使用 Backbone 作为工作示例,我的代码如下:

signupComplete: function() {
    swap(regions.content, new views.completeSignup({
        model: this.currentUser(),
        router: this
    }));
},

这存在于我的app-router.js 中,如您所见,它将路由器本身传递到实例化视图中。

在 CommonJS 风格的应用程序中是否推荐这种做法,在这些应用程序中,依赖关系保持在本地,建议不要使用“全局”。

不确定这里是否有正确的答案,只是寻找人们在使用 Browserify 构建客户端应用程序时采取的一些不同的方法,这个相对年轻的概念...

【问题讨论】:

    标签: backbone.js browserify commonjs


    【解决方案1】:

    单例模式类型的东西怎么样?

    var router;
    
    module.exports = function () {
      if (!router) router = new Router();
      return router;
    };
    

    【讨论】:

    【解决方案2】:

    这是一种避免将状态向下传递视图树的样板的方法,但仍为测试或子系统提供本地状态选项。 TL;DR:将它放在 View.prototype 上,必要时通过构造函数覆盖。

    在视图中(视图是我认为必要的唯一地方)我们通过this.user 访问用户,除非在构造函数中将实例传递给用户,否则它将来自原型。

    var View = Backbone.View.extend({
      constructor: function(opts) {
        if(opts.user) this.user = opts.user;
        if(opts.vent) this.vent = opts.vent;
    
        Backbone.View.apply(this,arguments);
      }
    });
    

    在生产启动脚本中,我们将任何应用范围的状态传递给原型:

    var user = new User;
    var vent = new Vent;
    
    View.prototype.user = user;
    View.prototype.vent = vent;
    

    在某些具有这些状态位的本地版本的子系统中,将其传入,它将优先于原型属性使用:

    var subVent = new Vent;
    var subA = new SomeView({name: "subA",vent: subVent});
    var subB = new SomeView({name: "subB",vent: subVent});
    

    测试中:

    var mockVent = new Vent;
    toTest = new SomeView({name: "testA",vent: mockVent});
    

    Here's 该技术的现场演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2012-06-13
      • 2017-10-20
      • 2020-08-24
      • 2013-04-27
      • 1970-01-01
      • 2019-12-28
      相关资源
      最近更新 更多