目前,当一个文章被添加到商店时,当我在路由中使用store.query()过滤服务器端时,我的视图没有更新,但当我使用store.findAll()过滤客户端时,它会更新。
使用findAll,过滤客户端
//route.js
model() {
return this.get('store').findAll('article');
}
//controller.js
articleSorted: computed.filterBy('model', 'isPublished', true),
并与查询过滤服务器端
//route.js
model() {
return this.get('store').query('article', { q: 'isPublished' }),
}
事实是findAll正在重新加载,而query未重新加载。
2条答案
按热度按时间vi4fp9gy1#
谢谢你的问题。我会尽我所能回答它,但它似乎像一些更多的文档应该被添加到灰烬指南来解释这种情况🤔
本质上,
this.store.findAll()
和this.store.query()
做的是两件完全不同的事情。findAll()
被设计成所有实体的表示(在您的例子中是文章),所以当商店找到更多它应该关心的文章时,结果会自动更新,这很有意义。它将返回一个将自动更新的DS.RecordArray
。另一方面,X1M4N1X被设计成每次其期望结果是什么时询问后端,并且您通常会向后端用来查找或过滤结果的
query()
调用传递许多参数。当添加满足相同查询的新文章时,这样说得通吗?你想让我说得更详细些吗?
t2a7ltrp2#
当使用
store.query
从服务器获取数据时,仍然可以在将视图保存到服务器 * 之前,使用新的客户端创建的存储数据自动更新视图,方法是为视图使用“实时”记录数组。虽然
store.query
中的数据不是实时的,但store.peekAll
中的数据是实时的,因此您可以先查询,然后再利用store.peekAll
进行显示。您可以在将模型设置为查看的数据之前进行查询,或者将查询保留为模型,但使用查看的数据的其他属性进行显示。重要的是确保在查看商店之前解析查询。基于您问题中的当前代码的示例:
请注意,在将新记录保存到服务器后,可以通过
update
方法或路由刷新更新查询。这将重新运行查询并从服务器获取更新的结果。如果查询是模型,则看起来像model.update()
。如果它被保存到someOtherProperty
,则为someOtherProperty.update()
。无论是哪种情况,route.refresh()
可被用来重新运行所有路由钩子。我认为有帮助的一些具体评论/示例: