2013-06-02 3 views
23

Мне нужно использовать глобальную переменную (пользовательский контекст, доступный из всего кода) Я прочитал несколько сообщений по этой теме, но у меня нет четкого ответа.Доступ к глобальной переменной из любого контроллера приложения

App = Ember.Application.create({ 
    LOG_TRANSITIONS: true, 
    currentUser: null 
}); 
  1. Это хорошая практика, чтобы установить глобальную переменную CurrentUser в объекте App?
  2. Как обновить и получить доступ к свойству currentUser со всех контроллеров, используемых в приложении?

ответ

58

Это хорошая практика, чтобы установить глобальную переменную CurrentUser в объекте App?

Нет, это не очень хорошая практика. Вам следует избегать использования глобальных переменных. Структура делает многое, чтобы сделать это возможным - если вы считаете, что глобальная переменная является лучшим решением, это признак того, что что-то нужно реорганизовать. В большинстве случаев правильное место находится в контроллере. Например, 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. Его можно получить из PostsController так:

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')); 
    } 
)} 

Если вам необходимо получить доступ CurrentUser от просмотра/шаблон, просто использовать needs, чтобы сделать его доступным через локальный контроллер. И если вам это нужно с маршрута, используйте метод маршрута routeFor.

+0

У меня есть несколько булевых свойств уровня приложения, и эти свойства будут использоваться почти во всех представлениях/шаблонах. Если я определяю их в 'applicationController', тогда я должен определить свойство' needs' во всем контроллере. Если я определяю их в приложении, тогда не нужно «потребностей». Любая мысль об этом? – Manoharan

+1

Я вижу аргумент для установки нескольких логических свойств на уровне приложения, например, сам ember определяет LOG_TRANSITIONS. Все более сложное должно быть в его собственном контроллере. Если вы находитесь в ситуации, когда вы хотите, чтобы один контроллер был доступен всем остальным, вы можете использовать инициализатор для ввода его в другие. См. Http://mcdowall.info/posts/ember-application-initializers/ для примера, который делает 'CurrentUserController' доступным как свойство currentUser для всех контроллеров. Не могли бы сделать то же самое с ConfigController. –

+1

Ember.Computed должен быть Ember.computed – Nath

Смежные вопросы