如何访问模板中的全局变量?
How to get access to global variable in template?
我想使用需要从 REST API 获取的设置创建全局对象。我需要向 REST API 发出一个请求并获取设置,然后我想从任何控制器和任何模板访问这些设置。您有什么建议,该问题的最佳实践是什么?
您所描述的设置对象可能应该存在于 ApplicationRoute
的 model
挂钩中。然后,您可以通过说 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 调用 ??
初始化器可以用于 运行 在其他一些服务被解析后。就像我们的例子 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.");
});
}
});
我想使用需要从 REST API 获取的设置创建全局对象。我需要向 REST API 发出一个请求并获取设置,然后我想从任何控制器和任何模板访问这些设置。您有什么建议,该问题的最佳实践是什么?
您所描述的设置对象可能应该存在于 ApplicationRoute
的 model
挂钩中。然后,您可以通过说 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 调用 ??
初始化器可以用于 运行 在其他一些服务被解析后。就像我们的例子 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.");
});
}
});