我想知道如何在等待异步可观察到达时正确使用离子2加载控制器 - 因为可观察到的可能没有,单个或许多响应的“波”。
第一个问题 - 如何呈现
我应该使用loader.present()
还是loader.present().then(..
。我看到很多代码示例“忽略”加载器的异步性质(我甚至看到loader.present(//function to execute)
第二个问题 - 何时解雇
如前所述,订阅的响应可能会在未知的“响应波”中到达 - 考虑到它,何时应该关闭加载程序?如果没有回复怎么办?如果有几个回复怎么办? 例如:
let loader = this.loadingController.create({content : "something"})
loader.present().then(()=>{
source.subscribe((school)=>{
this.schools.push(school)
loader.dismiss()
}, err=> loader.dismiss()
)
})
第三个问题 - 如何解雇
我注意到解决加载控制器存在很多问题(例如Ionic 2 - Loading Controller doesn't work)。解雇后赶上是不够的??如果在加载后我想要推送到另一个页面怎么办......?
感谢您的耐心等待。
答案 0 :(得分:8)
第一个问题 - 如何呈现?
呈现加载程序的正确方法是使用then
,因为否则您可能会面临与错误动画相关的一些问题,也可能遇到其他一些奇怪的问题。毕竟,如果方法返回一个promise,那么使用它的正确方法总是在promise完成时做一些其他事情。
loader.present().then(() => { /* ... */ });
当我需要解除加载时,我也会这样做:
loading.dismiss().then(() => { /* ... */ });
第二个问题 - 什么时候解雇?
使用加载的想法是让用户知道后台发生了什么事情,所以我认为你应该在第一波之后忽略加载。
如果没有响应到达(例如结果为空),您可以包含*ngIf="result.items.length === 0"
条件以显示div,并显示结果为空的消息。如果新的 wave 与结果中的某些项一起到达,则该div将自动隐藏。
第三个问题 - 如何解雇?
就像present
方法一样,dismiss
也会返回一个承诺。在这种情况下,如果您不使用then
,则很容易在动画中看到一些错误的行为。所以再次,只需等待结束方法(通过使用then
),您可以推送新页面或做您需要做的事情,它应该正常工作:
loading.dismiss().then(() => { this.navCtrl.push(NewPage); });