2013-06-02 39 views
23

我需要使用一個全局變量(用戶上下文,可以從所有的代碼) 我已閱讀關於這個話題一些帖子,但我沒有一個明確的答案訪問一個全局變量。從任何應用程序控制器

App = Ember.Application.create({ 
    LOG_TRANSITIONS: true, 
    currentUser: null 
}); 
  1. 它是一個很好的做法,設置currentUser全局變量在App對象?
  2. 如何更新和訪問應用程序中使用的所有控制器的currentUser屬性?

回答

58

在App對象中設置currentUser全局變量是否是一種很好的做法?

不,這不是一個好的做法。你應該避免使用全局變量。框架做了很多事情來實現這一點 - 如果你發現自己認爲全局變量是最好的解決方案,那麼它就是一個應該重構的標誌。在大多數情況下,正確的地方是在一個控制器中。例如,currentUser可能是:

//a property of application controller 
App.ApplicationController = Ember.Controller.extend({ 
    currentUser: null 
}); 

//or it's own controller 
App.CurrentUserController = Ember.ObjectController.extend({}); 

如何更新和在應用程序中使用的所有控制器訪問currentUser財產?

使用needs屬性。假設您已聲明currentUser爲ApplicationController的屬性。如果你需要從一個視圖/模板訪問currentUser,只是用needs使其通過本地控制器訪問

App.PostsController = Ember.ArrayController.extend{(
    needs: ['application'], 
    currentUser: Ember.computed.alias('controllers.application.currentUser'), 
    addPost: function() { 
    console.log('Adding a post for ', this.get('currentUser.name')); 
    } 
)} 

:它可以從PostsController訪問這個樣子。如果您需要從路線中使用它,請使用路線的controllerFor方法。

+0

我有幾個應用程序級別的布爾屬性,這些屬性將在幾乎所有的意見/模板使用。如果我在'applicationController'中定義它們,那麼我必須在所有控制器中定義'needs'屬性。如果我在App中定義它們,那麼不需要''需要'。對此有何想法? – Manoharan

+1

我可以看到在應用程序級別設置一些布爾屬性的參數,就像ember本身定義的LOG_TRANSITIONS一樣。任何更復雜的東西都應該放在它自己的控制器中。如果您處於您希望一個控制器可用於所有其他控制器的情況,則可以使用初始化程序將其注入其他控制器。請參閱http://mcdowall.info/posts/ember-application-initializers/,該示例使'CurrentUserController'可用作所有控制器的'currentUser'屬性。可以很容易地做到與ConfigController相同。 –

+1

Ember.Computed應該是Ember.computed – Nath

相關問題