我读过与Substates等相关的Ember文档,我理解它是如何工作的。在我当前的应用程序中,我的loading.hbs和其他子loading.hbs模板工作正常。
我只是想讨论一个用例。
我想在这里发展我的理解。现在第二次加载屏幕没有显示,它告诉我们商店有数据,因此没有任何意义可以将其加载,并在获取商店发送请求与后端同步之后。
问题
现在我想知道这是否是Ember与Ember数据的默认行为?
要显示此加载屏幕,我是否必须手动执行某些操作?
理想情况下,我想要的是,如果第二次请求数据被提取然后显示它,同时显示加载器告诉用户它也正在与后端同步。
我知道一切都可以手动完成,我不想重新发明轮子或以非传统的方式做事。所以我想知道Ember提供的最佳优化解决方案,经验丰富的Ember开发人员可以帮助我理解。
提前致谢。
答案 0 :(得分:3)
现在我想知道这是否是Ember的默认行为 烬数据?
是的,当您执行findRecord
或findAll
分别适用于shouldBackgroundReloadRecord
或shouldBackgroundReloadAll
事件的默认行为时,这是Ember数据的默认行为,默认为true。您可以通过返回false将其关闭,并确保true
或shouldReloadAll
分别设置为ConcurrentKafkaListenerContainerFactory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.MANUAL_IMMEDIATE);
@KafkaListener(topics = "anotherBatchTopic", containerFactory = "batchContainerFactory")
public void listen(List<ConsumerRecord<byte[], String>> batch, Acknowledgment acknowledgment) throws Exception {
logger.info("===*** batch size : " + batch.size() + "***===");
batch.forEach(System.out::println);
acknowledgment.acknowledge();
}
,以确保请求始终访问API而不是从缓存中提取。
理想情况下,在屏幕上立即显示数据始终是可取的,因为它具有更好的用户体验,使用户感觉数据已经存在并且正在获取数据的某些部分。 shouldReloadRecord
要显示此加载屏幕,我是否必须手动执行某些操作?
答案 1 :(得分:1)
为了在我自己的研究之后添加更多细节,我在Ember docs中找到了有用且相关的详细信息。这是关于缓存的。
如果记录已经存在,那么承诺将立即得到解决,这就是为什么我没有看到已加载记录的加载屏幕,同时Ember-Data也与后端同步并重新渲染模板。
<强>缓存强> 商店会自动为您缓存记录。如果已经加载了记录,则第二次请求它将始终返回相同的对象实例。这样可以最大限度地减少到服务器的往返次数,并允许您的应用程序尽快向用户呈现其UI。
例如,当您的应用程序第一次要求商店提供ID为1的人员记录时,它将从您的服务器获取该信息。
但是,下次您的应用程序要求ID为1的人时,商店会发现它已经从服务器检索并缓存了该信息。它不会发送另一个相同信息的请求,而是为您的应用程序提供第一次提供的相同记录。此功能 - 始终返回相同的记录对象,无论您查找多少次 - 有时称为身份映射。
使用身份映射非常重要,因为它可以确保您在UI的某个部分所做的更改会传播到UI的其他部分。这也意味着您不必手动保持记录同步 - 您可以按ID要求记录,而不必担心应用程序的其他部分是否已经要求并加载它。
返回缓存记录的一个缺点是,您可能会发现数据的状态自首次加载到商店的身份映射后发生了变化。为了防止此陈旧数据长时间存在问题,每次从商店返回缓存记录时,Ember Data将自动在后台发出请求。当新数据进入时,记录会更新,如果自初始渲染以来记录发生了变化,则会使用新信息重新渲染模板。