我有一个从我的后端返回的数组格式的年份列表[2018,2019,2020]。现在,我正在使用设置控制器进行ajax调用,并将其设置为我的ember-power-select使用的值。但是,我只需要这样做一次,就像在应用程序加载时一样,并将其作为全局变量,而不是每次控制器加载时都这样做,因为该数组很少更改。
我应该怎么做?
答案 0 :(得分:0)
忘记全局变量。您需要的是应用程序范围的可用性,可以通过使用services获得。服务由应用程序的依赖项注入容器创建为单例(默认情况下),因此,在您应该选择注入它的任何位置都可以使用该服务。
看看我为您整理的twiddle。我做了一个小模拟服务,在可用时使用缓存的值。对我来说,这比使用可承诺的计算属性(尽管有可用的实现)更简单。
export default Ember.Service.extend({
loadDates(){
if(this.dates){
return Ember.RSVP.resolve(this.dates);
}else{
return this._loadAndCacheDatesFromApi();
}
},
_loadAndCacheDatesFromApi(){
// this is actually an api call in your case
return new Ember.RSVP.Promise((resolve) => {
setTimeout(() => {
this.set('dates', ['2019', '2020', '2021']);
resolve(this.dates);
}, 5000);
});
}
});
我们希望loadDates
的行为与从api加载还是从缓存加载一样,因此我们使函数始终返回promise(在缓存情况下使用resolve
函数) 。我仅使用setTimeout
进行说明...您实际上是在这里针对您的情况进行api调用,然后在返回时将dates
存储为服务的属性。
现在,任何要加载此路由的路由都将注入服务(通过Ember依赖注入框架),然后只需在setupController
import { inject as service } from '@ember/service';
export default Ember.Route.extend({
dateService: service() // this is shorthand for service('date-service'),
setupController(controller, model){
let dateService = this.get('dateService');
return dateService.loadDates().then((dates) => {
controller.set('dates', dates);
});
}
正如您在此处看到的那样,无论该代码到达缓存还是从api返回,调用代码都是不透明的。需要特别注意的是,这是有效的,因为服务是单例的(即,仅在首次使用时创建了一个实例)。这样,设置的属性才能真正共享。刷新应用程序显然会失去价值(如果需要更多长期存储,可以将其存储在本地存储中)。