为了账号安全,请及时绑定邮箱和手机立即绑定

可观察订阅触发后未更新的角度 UI

可观察订阅触发后未更新的角度 UI

慕盖茨4494581 2022-08-04 17:59:08
我有一个角度页面,它使用来自服务的可观察参数。但是,当此可观察更新时,页面不会更新以匹配。我尝试过将可观察的结果存储在平面值中,或者更改布尔值以调整UI,但似乎没有效果。记录可观察对象可确认它已正确更新,并在重新导航到该页面时显示新值。其他条件 UI 更新可以正确修改页面,只有下面的一个 () 导致此问题。*ngIf="(entries$ | async), else loading"component.tsexport class EncyclopediaHomeComponent implements OnInit {  entries$: Observable<EncyclopediaEntry[]>;  categories$: Observable<string[]>;  entry$: Observable<EncyclopediaEntry>;  entry: EncyclopediaEntry;  isEditing: boolean;  constructor(private route: ActivatedRoute, private encyService: EncyclopediaService) {    this.entries$ = encyService.entries$;    this.categories$ = encyService.categories$;    this.entries$.subscribe(es => {      console.log(es);    });    route.url.subscribe(url => this.isEditing = url.some(x => x.path == 'edit'));    this.entry$ = route.params.pipe(      switchMap(pars => pars.id ? encyService.getEntry(pars.id) : of(null)),    );    this.entry$.subscribe(entry => this.entry = entry);  }  ngOnInit(): void {  }  updateEntry(entry: EncyclopediaEntry) {    this.encyService.updateEntry(entry.id, entry);  }}组件.html<div class="encyclopedia-container">    <ng-container *ngIf="(entries$ | async), else loading">        <app-enc-list [entries]="entries$ | async"            [selectedId]="entry ? entry.id : null"></app-enc-list>        <ng-container *ngIf="entry">            <app-enc-info *ngIf="!isEditing, else editTemplate"                [entry]="entry$ | async"></app-enc-info>            <ng-template #editTemplate>                <app-enc-edit [entry]="entry$ | async" [categories]="categories$ | async"                    (save)="updateEntry($event)"></app-enc-edit>            </ng-template>        </ng-container>    </ng-container>    <ng-template #loading>        <mat-progress-bar mode="indeterminate"></mat-progress-bar>        <br>        <p>Loading Encyclopedia...</p>    </ng-template></div>
查看完整描述

1 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

该组件似乎没有看到更改。我不知道为什么,因为|异步将完成这项工作。


但要修复它,您可以使用ChangeDetector:



constructor(

   private route: ActivatedRoute,  

   private encyService: EncyclopediaService

   private changeDetectorRef: ChangeDetectorRef,

) {

    this.entries$ = encyService.entries$;

    this.categories$ = encyService.categories$;


    this.entries$.subscribe(es => {

      // setTimeout need to run without troubles with ng changes detector

      setTimeout(_=>{this.changeDetectorRef.detectChanges()},0);

      ...

    });

或者你可以使用markforCheck,就像那里描述的那样。


查看完整回答
反对 回复 2022-08-04
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信