如何避免使用trackBy函数避免为nGFor重建DOM - Angular Firestore

问题描述 投票:1回答:1

我正在尝试构建一个轮询应用程序。我已经使用* ngFor来循环查询数据以及每当我尝试添加或更新投票时。投票的价值会发生变化,但整个DOM正在重建(刷新)。如何避免重建整个DOM并更新投票值。我尝试使用trackBy函数。但它没有正常工作。

   ngOnInit() {
    this.postsCol=this.afs.collection('posts', ref => ref.where('postid', '==',this.id));
    this.posts = this.postsCol.valueChanges();
    this.posts = this.postsCol.snapshotChanges()
      .map(actions => {
        return actions.map(a => {
          const data = a.payload.doc.data() as Posts;
          const id = a.payload.doc.id;
          postId=id;
          return { id, data };
        });
      });
      this.pollsCol=this.afs.collection("posts").doc(this.id).collection("polls",ref => ref.orderBy('timestamp'));
      this.polls = this.pollsCol.valueChanges();
      this.polls = this.pollsCol.snapshotChanges()
      .map(actions => {
        return actions.map(a => {
          const data = a.payload.doc.data() as Polls;
          const id = a.payload.doc.id;
          pollId = id;
          return { id, data };
        });
      });
}

public trackByFn(poll){
  console.log("trackby"+poll);
  return poll;
}

  <div *ngFor="let poll of polls | async ; trackBy: trackByFn">
                  <div>

              <img [src]="poll.data.pollimage" class="mainpollimage">
              <br><br>
              <li><p class="mainpolltitle">{{ poll.data.polltitle}}</p>
              <p class="mainpollcontent">{{poll.data.pollcontent}}</p>
              <div class="votebox d-flex justify-content-start">
              <p class="mainpollvotes" ng-attr-id="{{poll.id}}" id="{{poll.id}}">{{poll.data.votes}} Votes</p>
              <div class="ml-auto" >
              <a    (click)="addVote(post.id,poll.id)" class="btn-floating btn-sm blue-gradient  ml-auto" ><i class="fa fa-star voteicon"></i></a>
              </div></div>
            </li>
            <br>
            <br>
            </div>
            </div>

如何在不刷新/重建DOM的情况下显示更新的值?谢谢

javascript angular dom google-cloud-firestore
1个回答
0
投票

因为在trackBy函数中,您返回的是作为输入参数获得的对象,所以您的操作与默认的ngFor相同:比较对象引用。每当使用新值触发observable时,您将获得所有对象的新对象引用。你需要一些能识别你的物体的东西。由于您要映射到具有id和data属性的对象,因此可以使用对象的id。此外,trackBy函数的方法签名是2个参数...索引和数组本身的项目。

public trackByFn(index, poll){
  return poll.id;
}
© www.soinside.com 2019 - 2024. All rights reserved.