如何与RequireJS共享全局变量/对象

时间:2017-02-14 15:07:38

标签: javascript backbone.js requirejs backbone-views

我想在main.js中设置变量或对象,然后我可以从任何骨干视图中引用它。

我考虑使用localStorage,但是数据是动态的并且有点敏感,所以我不希望它存储在localStorage中,因为它可以很容易地由用户操作。

2 个答案:

答案 0 :(得分:1)

既然你说过" main.js"我认为你在RequireJS和Backbone.js之间感到困惑。 RequireJS不是Backbone的一部分。它是一个AMD模块加载器,它恰好与骨干项目一起使用。

看起来你需要一个RequireJS模块,如:

define(function (require) {
  var someData;
  var singleton = function () {
    return {
        getMyData = function(){},
        setMyData = function(data){},
    };
  };
  return singleton();
});

P.S:上面的代码可以成为对象文字,一个正确的构造函数的实例,es6类的任何东西。我刚发布了一些例子。

答案 1 :(得分:0)

@TJ already gave what's needed在我的应用中实现我称之为服务的内容,借鉴AngularJS services。我有几个服务,比如i18n,它只是一个i18next实例。

与您一样,我希望管理与应用程序相关的某些数据,这些数据可以在任何地方共享,而不会将其放在window对象中。

我想出了一个AppState服务,它只是一个Backbone模型实例。

define(['underscore', 'backbone', 'color'], function(_, Backbone, Color) {

    var State = Backbone.Model.extend({

        setBrandColor: function(hexColor, options) {
            return this.set({ color: new Color(hexColor) }, options);
        },

        getBrandColor: function() {
            return this.get('color');
        },
    });

    return new State(); // return a new instance instead of the constructor.
});

Backbone模型的优点是应用程序中的任何内容都可以监听其事件。这是受到React的启发。

this.listenTo(AppState, 'change:color', this.onBrandColorChange);

请注意,我更喜欢将PascalCase用于服务,即使它们是实例,它们与其他语言的静态类型密切相关。

这样,当应用状态发生变化时,应用的其他部分可能会或可能不会做出相应的反应。没有事件,应用程序需要更多耦合,这是不可取的。