2017-02-14 134 views
0

我想在main.js中設置一個變量或對象,然後我可以從任何骨幹視圖中引用它。如何與RequireJS共享一個全局變量/對象

我考慮過使用localStorage,但數據是動態的並且有點敏感,所以我不想將它存儲在localStorage中,因爲它可以很容易地被用戶操縱。

回答

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類的什麼。我剛剛舉了一些例子。

+0

也許有點困惑。我正在使用requireJS和我的backbonejs應用程序。我需要以某種方式在我的main.js中註冊一個變量或對象,然後我可以從backbonejs視圖中引用該視圖,該視圖是一個單獨的js文件(在r.js之前)。 – David

+0

你可以在你的main.js中需要你的singleton模塊,併爲它設置任何值。然後,您可以通過在您的骨幹視圖的模塊中要求/添加此模塊作爲依賴項來檢索該值。在其他作品中,您的數據存儲在requirejs模塊中 –

0

@TJ already gave what's needed實現我所說的服務在我的應用程序中,從AngularJS services借用。我有幾個服務,如i18n這僅僅是一個下一個實例。

和你一樣,我想管理與應用程序相關的某些數據,這些數據可以在任何地方共享,而不必將其放入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的服務,即使他們的情況下,他們密切相關的其他語言的靜態類型。

這樣,當該應用的應用程序狀態的變化,其他部分可以或可以不相應地作出反應。沒有這些事件,應用程序將需要更多的耦合,這是不可取的。