gpt4 book ai didi

javascript - Angular 绑定(bind)在 Observable 调用之前没有改变

转载 作者:行者123 更新时间:2023-11-29 20:54:41 24 4
gpt4 key购买 nike

我正在使用 Angular 4+,我注意到当 Observable 立即(同步?)解析时,在我调用 Observable.subscribe() 之前 Angular 没有更新绑定(bind)值。在其他地方这工作正常,因为网络调用延迟 Observable 完成足够长的时间以使初始绑定(bind)更改在 Angular 中生效。

https://plnkr.co/edit/LV0On7?p=preview

//our root app component
import {Component, VERSION} from '@angular/core';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';

@Component({
selector: 'my-app',
template: `
<div>
<h2>{{name}}</h2>
<button class="btn btn-primary" (click)="onAlertClickedNoDelay()">Call Observable Without Delay</button>
<button class="btn btn-primary" (click)="onAlertClickedDelay()">Call Observable With Delay</button>

<alert *ngIf="isAlertVisible()" type="success" dismissible="true" (onClose)="onAlertClose()">
Async action successful!
</alert>
</div>
`,
})
export class AppComponent {
name:string;
private isCallComplete = false;
isAlertVisible(): boolean {
console.log("isAlertVisible() binding updating: ", this.isCallComplete);
return this.isCallComplete;
}
constructor() {
this.name = `Angular! v${VERSION.full}`
}

onAlertClickedNoDelay() {
this.isCallComplete = false;
console.log("set isCallComplete = false");
Observable.of("some data").subscribe(data => {
this.isCallComplete = true;
console.log("set isCallComplete = true");
});
}

onAlertClickedDelay() {
this.isCallComplete = false;
console.log("set isCallComplete = false");
Observable.of("some data").delay(0).subscribe(data => {
this.isCallComplete = true;
console.log("set isCallComplete = true");
});
}

onAlertClose() {
this.isCallComplete = false;
console.log("set isCallComplete = false");
}
}

没有 Observable.delay(),控制台打印:

set isCallComplete = false
set isCallComplete = true
isAlertVisible() binding updating: true
isAlertVisible() binding updating: true

当使用 Observable.delay() 时,控制台正确打印:

set isCallComplete = false
isAlertVisible() binding updating: false
isAlertVisible() binding updating: false
set isCallComplete = true
isAlertVisible() binding updating: true
isAlertVisible() binding updating: true

1) 为什么 Angular 在使用 Observable.delay(0).subscribe() 而不是 Observable.subscribe() 时检测初始属性绑定(bind) (isCallComplete = false)?

2) 在调用 Observable.subscribe() 之前绑定(bind)到繁忙属性值的最佳解决方案是什么?

最佳答案

因为 Angular 从来没有机会检查 isCallComplete 的值。

您的 Observable 的订阅回调在创建后立即执行。

使用 delay(0) 等同于使用 setTimeout(()=>/*...*/,0),从而延迟执行当前同步代码执行后的订阅回调(在本例中 Angular 检查组件的值)

关于javascript - Angular 绑定(bind)在 Observable 调用之前没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49906221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com