你有使用emberjs的延期服务吗?

时间:2017-10-10 20:37:07

标签: ember.js ember-data ember-cli

我正在尝试使用Ember CLI从似乎不适合使用Ember Data的旧API加载数据。通常在页面加载时加载此数据,然后在整个应用程序的许多位置重复使用。我创建了一个服务' legacy_data'为此:

import Ember from 'ember';

export default Ember.Service.extend({
  ready: null,
  legacy_data: null,

  init(){
   this.ready = Ember.$.ajax( ... ).done(function(legacy_data){
     this.set('legacy_data', legacy_data);
  }

  computed_attr: Ember.computed('legacy_data', function(){ ... },

  ...more functions and computed attributes
});

因为' init'函数似乎不支持返回一个promise(就像路由上的模型钩子一样),每当我想使用这个服务时,我都必须做这样的事情:

injected_service.ready.then(function(legacy_data){
 ... use service
});

在实践中,我最终会在我的代码库中完成一大堆额外的承诺处理 - 感觉就像我在游戏中遇到的那样。

有更好的方法吗?也许生命周期钩子或工厂/初始化器支持延迟服务初始化,所以我不必担心它在我的代码库中的其他地方?初始化器支持这个吗?我没有在任何例子中看到它。有没有其他方法可以解决这个问题? (Ember数据必须以某种方式处理同样的问题,但我不熟悉框架,所以不确定)

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为您应该将代码从init挂钩移动到函数loadData(或您喜欢的任何名称),然后从应用程序的beforeModel调用此函数路线。这将确保数据始终加载。

答案 1 :(得分:1)

在Ember中,路线有beforeModelmodelafterModel等钩子。如果你从这些钩子返回promises,则承诺处理由Ember完成。

顺便说一句,即使您使用的是Ember数据,也应该通过路由调用store。如果您访问组件中的商店,则需要再次处理承诺。

但是,你要求一种方法推迟申请,直到承诺得到解决。这可以通过application route s beforeModel挂钩来实现。 (我需要这个来检索我的客户端应用程序中的用户权限。因为我无法在我的所有路由中放置权限保证处理,所以我把它放在我的application route中。)所以,看看{ {3}}