我的后端公开了以下查询:
GET /api/foos
GET /api/foos/:foo_id
我的前端在左侧显示一个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重新获取之前已经获取过的对象?
答案 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
分别设置为true
和false
。
答案 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。