使用最新版本的Ember-Data和RESTAdapter,有没有办法做到以下几点?
我有一个名为App
的资源和一个通过返回正确的JSON(/apps
等来响应{ apps: [...] }
的API。)
由于这是从我们服务器上的静态json提供的,因此为每个可以作为/apps/:app_id
获取的应用程序创建服务器端资源是不合适的。相反,如果RESTAdapter 总是加载/apps
,那就好了,即使它只使用了一个应用程序中的一个应用程序。
我是否必须编写自己的适配器才能实现此目的?如果是的话,"钩入"?
会有什么好处答案 0 :(得分:1)
假设您有一个应用模型App.App
,应该在您的应用加载时调用App.App.find()
就足够了。这将使AJAX调用/apps
。即使您不将结果缓存在变量中,您的数据存储也将填充返回的记录。现在,无论何时拨打App.App.find(id)
,Ember Data都会检查您的商店并返回记录(如果有)。如果它没有记录,那么它将尝试调用/apps/:id
,但如果您的应用程序仅设计为使用静态集合,则不会发生这种情况。
您可以在App.App.find()
电话中放置几个不同的地方。我可能会把它放在App.ready
:
App = Ember.Application.create({
ready: function() {
// pre-load apps
App.App.find();
}
});
App.App = DS.Model.extend({
//...
});
答案 1 :(得分:0)
看起来有点hacky(可能是),但看起来人们可以通过覆盖DS.Adapter:find()
来实现这一点。
在我的情况下,为了阻止对/app/:app_id
的调用,我写了这个:
find: function(store, type, id) {
// Terminate calls for single app
if (type === App.App) {
// instead, load all apps and drop this request
App.App.find();
return;
}
// or continue as usual
this._super(store, type, id);
}
当你有一个嵌入式层次结构时,这也有效:'always'记录,而Ember认为它必须加载一个中间层。只需确保在删除这样的请求时确保加载父项!