ember-model:如何强制记录从服务器重新获取GET?

时间:2014-03-07 04:01:22

标签: javascript ember.js adapter ember-model

我的后端公开了以下查询:

  • GET /api/foos
    • 返回所有Foos的列表,适合在主列表中显示
  • GET /api/foos/:foo_id
    • 返回单个Foo,其中包含更详细的信息,适合在详细视图中显示

我的前端在左侧显示一个Foos列表,当点击其中一个时,右侧的插座(在插座中)显示其详细版本。

{{#each foo in model}}
    {{#link-to 'foo' foo}}{{foo.name}}{{/link-to}}
{{/each}}
{{outlet}}

我正在使用ember-model来存储我的模型,并且已经实现了App.Foo.adapter的{​​{1}}和find个钩子,这样当它们被调用时,它们就会回来正确描述了上述API。

当我的应用首先点击findAll(通过GET /api/foos),然后当用户点击Foo时,并且ember-model没有点击findAll,因为它没有不要调用GET /api/foos/:foo_id钩子,因为它意识到该特定模型已经在缓存中。

这很棒,因为当我们知道我们已经在内存中拥有它时,为什么要再次获取内容。

但是,在我的应用中,这个假设是不够的。我必须进一步检查我是否已获得该Foo的完整版本,例如find,否则我想强迫Foo再次获取。

我怎样才能做到这一点 - 如何让ember-model重新获取之前已经获取过的对象?

2 个答案:

答案 0 :(得分:1)

这曾经是一个已知的问题,但最近已得到解决。

逐字记录:https://github.com/ebryn/ember-model/pull/297(ckung的评论)

  

开发人员可以在扩展的类上定义“transient:false”   Ember.Model,这将跳过缓存检查。

提交:https://github.com/ckung/ember-model/commit/dc46171d2121630e62a130d58dd6b709c6c00541

将您的ember-model更新为相关版本,然后您就可以开始工作了。

-

编辑:抱歉,我认为下一个块文本是我上次编辑的 - 但是它没有。

所以现在我的想法是做CachedModel extends LiveModel extends Ember-Model之类的事情。然后将transient分别设置为truefalse

答案 1 :(得分:1)

所以这就是我最终的结果:

App.FooDetailRoute = Ember.Route.extend({
    model: function() {
        var foo = this.modelFor('foo');
        if (!foo.get('propertyOnlyInDetailedVersion')) {
            //if foo does not have propertyOnlyInDetailedVersion property, we know that only the
            //summarised foo has been last fetched.
            //to force a re-fetch, we trick ember-model by setting isLoaded to false
            //before triggering fetch once more
            foo.set('isLoaded', false);
            var refetchedFoo = App.Foo.find(parseInt(foo.get('id'), 10));
            return refetchedFoo ;
        }
        return foo;
    }
});

tl; dr =将model.isLoaded设置为false并再次调用model.find。