始终从“索引”加载单个对象

时间:2013-03-27 14:50:42

标签: ember.js ember-data

使用最新版本的Ember-Data和RESTAdapter,有没有办法做到以下几点?

我有一个名为App的资源和一个通过返回正确的JSON(/apps等来响应{ apps: [...] }的API。)

由于这是从我们服务器上的静态json提供的,因此为每个可以作为/apps/:app_id获取的应用程序创建服务器端资源是不合适的。相反,如果RESTAdapter 总是加载/apps,那就好了,即使它只使用了一个应用程序中的一个应用程序。

我是否必须编写自己的适配器才能实现此目的?如果是的话,"钩入"?

会有什么好处

2 个答案:

答案 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认为它必须加载一个中间层。只需确保在删除这样的请求时确保加载父项!