【问题标题】:Custom Pipe Angular, TypeError: Cannot read property 'reduce' of undefined自定义管道角度,类型错误:无法读取未定义的属性“减少”
【发布时间】:2018-08-29 09:08:27
【问题描述】:

我正在从 Firebase 数据库中获取课程:

              this.fetchItems()
              .subscribe((res) => {
                   this.coursesFiltered = res.filter((filtered: any) => {
                    return filtered.courseStatus === 2 || filtered.courseStatus === 3
                   });


               });

函数fetchItems()

  fetchItems() {
    return this.afDB.list('courses', (ref) => ref.orderByChild('courseSemCode'))
       .snapshotChanges()
       .map((arr) => {
          return arr.map((snap: any) => {
            return snap.status = snap.payload.val();
          });
        });
      }

然后我想按 courseSemCode 对它们进行分组,以便它在卡片中正确显示

<ion-card *ngFor="let item of coursesFiltered | groupBy:'courseSemCode'">
    <ion-card-header>
      <h6>{{item.courseSemester + " " + item.courseYear}}</h6>
    </ion-card-header>

    <ion-card-content>

        <ion-list>
            <button ion-button class="text" class="btnCourse">
              {{item.courseName}}
            </button>
        </ion-list>
    </ion-card-content>
  </ion-card>

groupBy 管道是我从这个线程中获得的自定义管道: How to group data in Angular 2?

这是什么:

    @Pipe({name: 'groupBy'})
export class GroupByPipe implements PipeTransform {
  transform(value: Array<any>, field: string): Array<any> 
{
  if(!value || !value.length) { 
    return value; 
  }else{
    const groupedObj = value.reduce((prev, cur)=> {
      if(!prev[cur[field]]) {
        prev[cur[field]] = [cur];
      } else {
        prev[cur[field]].push(cur);
      }
      return prev;
    }, {});
    return Object.keys(groupedObj).map(key => ({ key, value: groupedObj[key] }));
  }
  }  
}

但不幸的是,我最终遇到了问题 TypeError:无法读取未定义的属性“减少”

我相信这与我在构造函数中编写的 .subscribe 有关,这仅意味着 courseFiltered 仍然没有数据。

我怎样才能确保它确实如此并解决这个问题?

谢谢

【问题讨论】:

  • 您是使用async 管道来显示数据,还是使用变量?
  • @trichetriche 我只使用 groupBy 作为管道
  • 好的,那看我的回答!

标签: angular undefined typeerror angular-pipe


【解决方案1】:

我认为在设置 coursesFiltered 之前进行评估时失败。也许将 coursesFiltered 初始化为一个空数组。

this.coursesFiltered: any[] = [];

【讨论】:

  • 它确实帮助我正确显示应用程序,但所有内容都显示“未定义”。
【解决方案2】:

在您的管道中,您可以简单地对其进行测试:

transform(value: any, args?: any) {
  if(!value || !value.length) { return value; }
  return value.reduce(...);
}

编辑在你的循环中你这样做

*ngFor="let item of coursesFiltered | groupBy:'courseSemCode'"

但是分组数组的结构是这样的

[{key: 'your key', value: [...]}]

这意味着你必须做两个循环:

<ion-card *ngFor="let group of coursesFiltered | groupBy:'courseSemCode'">
  <ng-container *ngFor="let item of group.value">
    <ion-card-header>
      <h6>{{item.courseSemester + " " + item.courseYear}}</h6>
    </ion-card-header>

    <ion-card-content>

        <ion-list>
            <button ion-button class="text" class="btnCourse">
              {{item.courseName}}
            </button>
        </ion-list>
    </ion-card-content>
  </ng-container>
</ion-card>

【讨论】:

  • 它也确实有助于消除错误,但我现在只看到“未定义”应该是正确的值。
  • 很多未定义的还是只有一个?
  • “item”所在的所有字段。他们都显示未定义
  • 那么你的管道不工作了。你能分享你的管道代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2018-12-04
  • 2019-11-16
  • 2020-11-04
  • 1970-01-01
相关资源
最近更新 更多