Javascript 余烬模型:如何强制从服务器重新获取记录?
我的后端公开了以下查询:Javascript 余烬模型:如何强制从服务器重新获取记录?,javascript,ember.js,adapter,ember-model,Javascript,Ember.js,Adapter,Ember Model,我的后端公开了以下查询: GET/api/foos 返回适合在主列表中显示的所有FOO的列表 GET/api/foos/:foo\u id 返回单个Foo,其中包含更详细的信息,适合在详细视图中显示 “我的前端”在左侧显示一个FOO列表,当单击其中一个时,右侧的插座(在插座中)显示其详细版本 {{#each foo in model}} {{#link-to 'foo' foo}}{{foo.name}}{{/link-to}} {{/each}} {{outlet}} 我
GET/api/foos
- 返回适合在主列表中显示的所有FOO的列表
GET/api/foos/:foo\u id
- 返回单个Foo,其中包含更详细的信息,适合在详细视图中显示
{{#each foo in model}}
{{#link-to 'foo' foo}}{{foo.name}}{{/link-to}}
{{/each}}
{{outlet}}
我正在使用来存储我的模型,并且已经实现了App.Foo.adapter
的find
和findAll
钩子,这样当调用它们时,它们会正确地命中上面描述的后端API
当我的应用程序首先点击GET/api/foos
(通过findAll
),然后当用户点击Foo时,余烬模型没有点击GET/api/foos/:Foo\u id
,因为它没有调用find
钩子,因为它意识到特定的模型已经在缓存中
这很好,因为当我们知道我们的记忆中已经有东西时,为什么还要再去拿呢
然而,在我的应用程序中,这个假设是不够的。我必须进一步检查我是否已获得该Foo的完整版本,例如!!aFoo.get('propertyOnlyInDetailedVersion')
,否则我想强制Foo再次获取
如何执行此操作?如何使ember model重新获取之前已获取的对象?这曾经是一个已知问题,但最近得到了修复 逐字摘自:(钟的评论) 开发人员可以在扩展的类上定义“transient:false” Ember.Model,这将跳过缓存检查 提交: 将您的
ember模型
更新到相关版本,您就可以开始工作了
--
编辑:对不起,我以为下一个块文本是我最后一次编辑的,但可惜没有
所以我现在的想法是做一些类似于
CachedModel扩展LiveModel扩展Ember Model
。然后分别将transient
设置为true
和false
。因此,这就是我最终的结果:
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。谢谢您的回答。但是,我确实希望保留这个缓存版本,而是执行我自己的测试,以确定是否应该重新获取它,如上所述。本质上,我希望能够在每次调用
find
时确定它是否是“瞬态的”。你有什么建议可以让我做这件事吗?@seth-谢谢你给我指明了正确的方向。我有自己的解决办法。我认为我的用例太具体了,无法将PR提交给ember model
over-所以我将把它作为“为我工作”的东西+我想我的答案要完整一点。。所以我编辑了我最初想法的答案。但我看到你已经有了解决办法!@赛斯-是的,我知道你要去哪里。。点击这里,如果你提交了一个公关到余烬模型与通用版本的,或什么,我很想知道。真棒。我很高兴你解决了这个问题(y)