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

How to get access to global variable in template?

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

您所描述的设置对象可能应该存在于 ApplicationRoutemodel 挂钩中。然后,您可以通过说 modelFor('application')(请参阅 here). There is also a needs API (see here)在所有其他模型中检索它,这样您就可以在应用程序中的控制器之间共享内容。

概念

好的做法是使用 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 调用 ??

初始化器可以用于 运行 在其他一些服务被解析后。就像我们的例子 storestore 是我们需要以良好方式 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.");

       });
   }

});