如何在模板中访问全局变量?

时间:2015-02-25 16:50:11

标签: ember.js ember-cli

我想创建具有我需要从REST API获取的设置的全局对象。我需要向REST API发出一个请求并获取设置,之后我想从任何控制器和任何模板访问这些设置。你有什么建议,这个问题的最佳实践是什么?

2 个答案:

答案 0 :(得分:6)

概念

良好的做法是使用initializers。它们允许将任何数据注入路径,控制器或任何其他类型的对象。

让我们举一个例子 来自Ember.js官方网站的例子

1。 您有一个Application,并且您有logger这样的服务 -

App = Ember.Application.extend();

App.Logger = Ember.Object.extend({
  log: function(m) {
    console.log(m);
  }
});

2。 现在您希望此功能log可在所有routes上使用 -

App.IndexRoute = Ember.Route.extend({
  activate: function(){
    // The logger property is injected into all routes
    this.logger.log('Entered the index route!');
  }
});

3. 告诉ember将一个名为Logger的对象注入所有路由。使用initializer像这样

//I want to inject something
Ember.Application.initializer({

  //this dependency name is logger
  name: 'logger',

  //whenever ember runs
  initialize: function(container, application) {

    //register my logger object under a name
    application.register('logger:main', App.Logger);

    //and use this service 'logger' in all 'routes'
    application.inject('route', 'logger', 'logger:main');
  }
});

通过这种方式,您可以在所有路由和控制器中使用您的应用程序级数据/代码。

在控制器中获取数据后,您可以非常轻松地在模板中使用它。

如何使用初始化程序进行API调用?

初始化程序可用于在解决其他一些服务后运行。就像我们的案例store一样。 store是我们需要以良好的方式对服务器进行API调用的对象(我们可以使用$.getJSON()或其他任何问题)

告诉初始化程序在store加载

之后运行
//I want to inject something but only after store resolved
Ember.Application.initializer({

  //this dependency name is logger
  name: 'logger',

  //wait for store object to be loaded, we need it to make API call
  after : 'store',


  //whenever ember runs
  initialize: function(container, application) {

      //grab the store object from container
      var store = container.lookup('store:main');

      //now you the store make that API call
      self.store.find('user',{current:true}).then(function(data){

            //we have the data we can inject it
            data = data.get('firstObject');
            container.lookup('controller:base').set('user', data);

            //user lookup success
            console.log("We have found an user. Yeah ember rocks.");

       });
   }

});

答案 1 :(得分:0)

您描述的设置对象应该位于ApplicationRoute的{​​{1}}挂钩内。然后,您可以通过model(请参阅here)在所有其他模型中检索它。还有一个modelFor('application') API(请参阅here),可让您在应用程序中的控制器之间共享内容。