2

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

  • GET /api/foos
    • 返回所有 Foo 的列表,适合在主列表中显示
  • 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'sfindfindAll钩子,这样当它们被调用时,它们会正确地命中上述后端 API。

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

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

但是,在我的应用程序中,这个假设是不够的。我必须进一步检查我是否获得了该 Foo 的完整版本,例如!!aFoo.get('propertyOnlyInDetailedVersion'),否则我想强制 Foo 再次获取。

我该怎么做 - 如何让 ember-model 重新获取之前已经获取的对象?

4

2 回答 2

1

这曾经是一个已知问题,但最近得到了修复。

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

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

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

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

--

编辑:对不起,我认为下一个块文本是我最后一次编辑——但可惜没有。

所以我现在的想法是做类似的事情CachedModel extends LiveModel extends Ember-Model。然后分别设置transienttruefalse

于 2014-03-07T04:09:31.330 回答
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。

于 2014-03-07T04:54:08.067 回答