我正在尝试使用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数据必须以某种方式处理同样的问题,但我不熟悉框架,所以不确定)
感谢您的帮助。
答案 0 :(得分:1)
我认为您应该将代码从init
挂钩移动到函数loadData
(或您喜欢的任何名称),然后从应用程序的beforeModel
调用此函数路线。这将确保数据始终加载。
答案 1 :(得分:1)
在Ember中,路线有beforeModel
,model
,afterModel
等钩子。如果你从这些钩子返回promises,则承诺处理由Ember完成。
顺便说一句,即使您使用的是Ember数据,也应该通过路由调用store
。如果您访问组件中的商店,则需要再次处理承诺。
但是,你要求一种方法推迟申请,直到承诺得到解决。这可以通过application route
s beforeModel
挂钩来实现。 (我需要这个来检索我的客户端应用程序中的用户权限。因为我无法在我的所有路由中放置权限保证处理,所以我把它放在我的application route
中。)所以,看看{ {3}}