angular2材质可观察更新UI刷新

时间:2018-01-18 20:22:55

标签: angular observable material

这是一个更普遍的问题,但在这种情况下,我有一个带复选框的待办事项列表(属于一个可观察的)。当我更新复选框的状态时,整个observable都会刷新并且UI会更新,在这种情况下(如果它们打开),复选框会闪烁'从开到开。

有没有办法避免这种情况?

我的组件是:

ngOnInit() {
    this.myTasksSub = MeteorObservable.subscribe('myTasks', this.username).subscribe(() => {
      MeteorObservable.autorun().subscribe(() => {
        this.tasks = Tasks.find();

        if (!this.tasks) return;
      });
    });
  }

和html:

<div class="card-outer" *ngFor="let task of tasks | async; let i = index">
    <div class="card-container">
        <div class='card-body'>
          <div *ngFor="let todo of task.todos | todosFilter:task.filterTodos" class="todo-wrapper">
            <mat-checkbox 
              [checked]="todo.done" 
              (change)="toggleTodo(task,todo)" 
              [(ngModel)]="todo.done">
            </mat-checkbox>

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。做了两个观察:

  1. 复选框在Safari中不会闪烁
  2. 最可能的原因是使用[(ngModel)](双向数据绑定)

docs中,我提供了两个选项-有和没有。没有[(ngModel)]的代码在Chrome中不会闪烁。

答案 1 :(得分:0)

对于遇到此问题的任何人,我通过添加返回索引的 trackBy 函数解决了此问题:

  public identifyFnBy(index: number): number {
    return index;
  }
        <div class='item' *ngFor='let item of items$ | async; trackBy: identifyFnBy'>
      
        </div>