ember.js ember存储,findAll正在重新加载视图和存储,查询未完成,

xjreopfe  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(122)

目前,当一个文章被添加到商店时,当我在路由中使用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未重新加载。

我找到了这个,但不理解https://github.com/emberjs/ember.js/issues/15256

vi4fp9gy

vi4fp9gy1#

谢谢你的问题。我会尽我所能回答它,但它似乎像一些更多的文档应该被添加到灰烬指南来解释这种情况🤔
本质上,this.store.findAll()this.store.query()做的是两件完全不同的事情。findAll()被设计成所有实体的表示(在您的例子中是文章),所以当商店找到更多它应该关心的文章时,结果会自动更新,这很有意义。它将返回一个将自动更新的DS.RecordArray
另一方面,X1M4N1X被设计成每次其期望结果是什么时询问后端,并且您通常会向后端用来查找或过滤结果的query()调用传递许多参数。当添加满足相同查询的新文章时,
这样说得通吗?你想让我说得更详细些吗?

t2a7ltrp

t2a7ltrp2#

当使用store.query从服务器获取数据时,仍然可以在将视图保存到服务器 * 之前,使用新的客户端创建的存储数据自动更新视图,方法是为视图使用“实时”记录数组。
虽然store.query中的数据不是实时的,但store.peekAll中的数据是实时的,因此您可以先查询,然后再利用store.peekAll进行显示。您可以在将模型设置为查看的数据之前进行查询,或者将查询保留为模型,但使用查看的数据的其他属性进行显示。重要的是确保在查看商店之前解析查询。
基于您问题中的当前代码的示例:

// route.js
beforeModel() {
  // using return ensures this hook waits for the promise to resolve before moving on
  return this.store.query('article', { q: 'isPublished' });
}

model() {
  // Queried server data should now be available to peek at locally, 
  // so we can set the model to a live version of it. Don't append filterBy here,
  // otherwise it will no longer be live.
  return this.store.peekAll('article');
}

// controller.js
// seemingly redundant filter since using query, but needed if there are other records
// in the store that shouldn't be displayed, and is recomputed when 
// a record is added or removed from the store-based model
articleSorted: filterBy('model', 'isPublished', true) // filterBy imported from '@ember/object/computed'

// template.hbs
{{#each articleSorted as |article|}}
    {{!-- this displayed list should update as new records are added to the store --}}
    {{article}}
{{/each}}

请注意,在将新记录保存到服务器后,可以通过update方法或路由刷新更新查询。这将重新运行查询并从服务器获取更新的结果。如果查询是模型,则看起来像model.update()。如果它被保存到someOtherProperty,则为someOtherProperty.update()。无论是哪种情况,route.refresh()可被用来重新运行所有路由钩子。
我认为有帮助的一些具体评论/示例:

  • https://github.com/emberjs/ember.js/issues/15256#issuecomment-302894768
  • https://github.com/emberjs/ember.js/issues/15256#issuecomment-302906077
  • https://github.com/pouchdb-community/ember-pouch/issues/232#issuecomment-428927114

相关问题