存储来自ajax调用的全局变量

时间:2018-12-29 17:32:11

标签: javascript ember.js

我有一个从我的后端返回的数组格式的年份列表[2018,2019,2020]。现在,我正在使用设置控制器进行ajax调用,并将其设置为我的ember-power-select使用的值。但是,我只需要这样做一次,就像在应用程序加载时一样,并将其作为全局变量,而不是每次控制器加载时都这样做,因为该数组很少更改。

我应该怎么做?

1 个答案:

答案 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返回,调用代码都是不透明的。需要特别注意的是,这是有效的,因为服务是单例的(即,仅在首次使用时创建了一个实例)。这样,设置的属性才能真正共享。刷新应用程序显然会失去价值(如果需要更多长期存储,可以将其存储在本地存储中)。