【问题标题】:Ionic infiniteScroll: TypeError: Cannot read property '0' of undefined离子无限滚动:类型错误:无法读取未定义的属性“0”
【发布时间】:2019-02-05 22:39:35
【问题描述】:

我正在尝试显示一个类别中的所有项目。我有一个类别的 slug 或关键字,我可以用它来识别父类别,我得到父类别并用它来搜索所有具有相似父类别的类别。我有两个与分页相关的错误,这些错误是相关的。

网址ads_url:https://jokerleb.com/wp-json/wp/v2/ads?per_page=100&&page=。例如page=1

服务

  getAds(page): Observable<any[]> {
    return this.http.get(this.api_url + page)
      .flatMap((ads: any[]) => {
        if (ads.length > 0) {
          return Observable.forkJoin(
            ads.map((ad: any) => {
              return this.http.get(this.ads_thumb_url + ad.id)
                .map((res: any) => {
                  let media: any = res;
                  ad.media = media;
                  return ad;
                });
            })
          );
        }
        return Observable.of([]);
      });
  }

ts

  constructor(public navCtrl: NavController, public navParams: NavParams, public renderer: Renderer, public zone: NgZone, public adsProvider: AdsProvider) {

    this.category = this.navParams.get('category');

    this.loadAds();
  }
  loadAds(infiniteScroll?) {
    this.adsProvider.getAds(this.page).subscribe((data: any) => {
      if (!this.category.main) {
        if (this.category.slug) {
          for (let i = 0; i < data.length; i++) {
            if (data[i] !== undefined) {
              if (data[i].pure_taxonomies.ad_cat[0].slug.trim().toLowerCase() === this.category.slug.trim().toLowerCase()) {
                this.item_category = data[i].pure_taxonomies.ad_cat[0].term_id;
                break;
              }

            }
          }
          if (this.item_category !== undefined) {
            for (let i = 0; i < data.length; i++) {
              if (data[i].pure_taxonomies !== undefined) {
                if (data[i].pure_taxonomies.ad_cat[0].term_id === this.item_category ||
                  data[i].pure_taxonomies.ad_cat[0].slug.trim().toLowerCase() === this.category.slug.trim().toLowerCase()) {
                  this.items.push(data[i]);
                }
              }
            }
          }
        }
      } else {
        if (this.category.main === 2) {
          for (let i = 0; i < data.length; i++) {
            if (data[i] !== undefined) {
              if (data[i].pure_taxonomies.ad_cat[0].slug.trim().toLowerCase() === this.category.slug.trim().toLowerCase()) {
                this.item_category = data[i].pure_taxonomies.ad_cat[0].parent;
                break;
              }

            }
          }
          if (this.item_category !== undefined) {
            for (let i = 0; i < data.length; i++) {
              if (data[i].pure_taxonomies !== undefined) {
                if (data[i].pure_taxonomies.ad_cat[0].parent === this.item_category) {
                  this.items.push(data[i]);
                }
              }
            }
          }
        }
      }
      if (infiniteScroll) {
        infiniteScroll.complete();
      }
    });
  }
  loadMore(infiniteScroll) {
    this.page++;
    this.loadAds(infiniteScroll);
  }

html

<ion-content fullscreen class="home-content" [ngSwitch]="tab">
  <div *ngIf="items.length>0; then thenTemplateName else elseTemplateName">
  </div>
  <ng-template #thenTemplateName>
    <div class="all-lists">
      <div class="all-category" *ngSwitchCase="1">
        <ion-card class="category-card" *ngFor="let item of items" (click)="onShowItemDetail(item);">
          <span *ngIf="item.media.length">
            <img src="{{item.media[item.media.length-1].media_details.sizes.medium.source_url}}" />
          </span>
          <div class="card-title" text-uppercase>
            <h4 color="secondary">{{item?.title.rendered}}</h4>
          </div>
        </ion-card>
      </div>
    </div>
    <ion-infinite-scroll (ionInfinite)="loadMore($event)" loadingSpinner="bubbles">
      <ion-infinite-scroll-content></ion-infinite-scroll-content>
    </ion-infinite-scroll>
  </ng-template>
  <ng-template #elseTemplateName>
    <div class="all-lists">
      <div class="all-category" *ngSwitchCase="1">
        <ion-card text-center>
          <ion-card-header>
            This Category is empty
          </ion-card-header>
          <ion-card-content>
            This Category is empty
          </ion-card-content>
        </ion-card>
      </div>
    </div>
  </ng-template>
</ion-content>

有时我收到TypeError: Cannot read property '0' of undefined,如果找不到项目,我不会收到错误消息,如果我向下滚动太多会发生错误,loadMore() 函数被调用,它什么也没找到,我收到错误消息。

由于loadMore 和分页,我的代码中可能有两个问题,第一个是上面的错误,第二个是有时最后 2 或 3 项不显示。也许我正在增加页面而不检查是否还有要显示的项目。我不知道如何解决这个问题。

我认为如果有办法在分页之前判断项目是否存在,这两个错误都会得到修复。

【问题讨论】:

  • 我的回答对您有帮助吗?如果您将我的loadAds() 代码与您的代码进行比较,我实际上只是做了一些小的调整。告诉我。
  • @SallyCJ 你的回答很好,但它加载的广告没有我的代码那么多,我试图找出原因,也许是你的代码,也许是服务器,也许是我的代码,也许我犯了一个逻辑错误,试图了解发生了什么
  • 你能用你使用的所有代码在 StackBlitz 上创建一个演示吗?或者我们可以在其他地方实际测试您的应用?
  • @SallyCJ 我尝试将项目导入stackblitz,但它说他们只导入自动角度项目,如果你可以在本地测试它,这是项目,你会看到有些项目不像福特那样显示,只有一辆福特出现github.com/elieobeid7/jokerleb/tree/social-login-untested
  • @SallyCJ 请克隆social-login-untested 分支,部署它,去福特,例如你会看到只有1个车展,现在部署的分支是master分支

标签: angular ionic-framework ionic3


【解决方案1】:

(我正在改变我的回答,让您知道“丢失物品”的问题。)

来自您的评论:

请克隆social-login-untested 分支,部署它,去福特, 例如,您会看到只有 1 个车展

还有你的问题:

由于loadMore 和 分页,第一个是上面的错误,第二个是 有时最后 2 或 3 项不显示。

所以我克隆了你的GitHub reposocial-login-untested 分支,并在本地测试了应用程序。

我去了 Vehicles → Cars → Ford,并注意到只有一个项目显示,这实际上与预期的一样,因为 在第一页(第 1 到第 100 个项目),只有一个“福特”项目 em>,其余的在第 2 页等。

这意味着,其余的“福特”项目仅在您向下滚动页面时可见——并且只有如果您可以向下滚动页面。即document的高度大于window的高度。

否则,您将被困在第 1 页的结果上,而第 2 页和其他页面将永远无法加载。在 Chrome 上,toggle 设备工具栏 → 选择“响应式”并尝试400 x 320 px,如下所示:

400 x 320 px,您可以向下滚动,这样所有“福特”项目都会被加载。

我能想到的解决问题的一种方法是使用看起来像这样的逻辑(请参阅 src/pages/category-details/category-details.ts 中的 CategoryDetailsPage.loadAds()):

if ( {DOCUMENT'S HEIGHT} <= {WINDOW'S HEIGHT} ) {
  // Loads next page without waiting for the scrolling to occur; but stops
  // loading when scrolling starts - for that, the logic is not included.
  this.loadMore( infiniteScroll );
} else if ( infiniteScroll ) {
  infiniteScroll.complete();
}

.. 但是(因为我实际上在 AngularJS 和 Ionic 方面经验较少)您需要自己创建它.. 您可能还想在 window/document onscroll 添加一个侦听器事件并停止页面滚动上的loadMore()。并确保没有(或只是删除/隐藏)重复项。

不过,我希望这个“新”答案能对您有所帮助。 =)

补充说明

正如我在我的评论中指出的那样,如有必要,您可以通过标题X-WP-TotalPages 检索可用的总页数。见https://developer.wordpress.org/rest-api/using-the-rest-api/pagination/

【讨论】:

  • js 不起作用DOCUMENT'S HEIGHT} &lt;= {WINDOW'S HEIGHT 我得试试 x-wp-totalpages
【解决方案2】:

试试这个(我添加了更多检查)

loadAds(infiniteScroll?) {
    this.adsProvider.getAds(this.page).subscribe((data: any) => {
      if (!this.category.main) {
        if (this.category.slug) {
          for (let i = 0; i < data.length; i++) {
            if (data[i] !== undefined && (data[i].pure_taxonomies.ad_cat || []).length ) {
              if (data[i].pure_taxonomies.ad_cat[0].slug.trim().toLowerCase() === this.category.slug.trim().toLowerCase()) {
                this.item_category = data[i].pure_taxonomies.ad_cat[0].term_id;

                break;
              }

            }
          }
          if (this.item_category !== undefined) {
            for (let i = 0; i < data.length; i++) {
              if (data[i].pure_taxonomies !== undefined && (data[i].pure_taxonomies.ad_cat || []).length) {
                if (data[i].pure_taxonomies.ad_cat[0].term_id === this.item_category ||
                  data[i].pure_taxonomies.ad_cat[0].slug.trim().toLowerCase() === this.category.slug.trim().toLowerCase()) {

                  this.items.push(data[i]);
                }
              }
            }
          }
        }
      } else {
        if (this.category.main === 2) {
          for (let i = 0; i < data.length; i++) {
            if (data[i] !== undefined && data[i].pure_taxonomies && (data[i].pure_taxonomies.ad_cat || []).length) {
              if (data[i].pure_taxonomies.ad_cat[0].slug.trim().toLowerCase() === this.category.slug.trim().toLowerCase()) {
                this.item_category = data[i].pure_taxonomies.ad_cat[0].parent;

                break;
              }

            }
          }
          if (this.item_category !== undefined) {
            for (let i = 0; i < data.length; i++) {
              if (data[i].pure_taxonomies !== undefined && (data[i].pure_taxonomies.ad_cat || []).length) {
                if (data[i].pure_taxonomies.ad_cat[0].parent === this.item_category) {

                  this.items.push(data[i]);
                }
              }
            }
          }
        }
      }
      if (infiniteScroll) {
        infiniteScroll.complete();
      }
    });
  }

【讨论】:

  • 我认为错误已修复,但我无法理解的是,如果您快速测试一下,您会发现某些类别(例如 bmw)效果很好,可能缺少 1 项但福特有这么多的项目丢失。尽管两者都有正确的 slug 和父类别 github.com/elieobeid7/jokerleb/tree/social-login-untested
  • @Lynob 很难知道你的问题到底是什么。你的问题是关于未定义的索引,现在已经解决了。也许编辑问题以清楚说明什么不起作用。我试过你的项目,它似乎对我有用,但我不知道应该准确显示什么......
【解决方案3】:

正如您在问题中已经提到的,当您尝试访问为空的元素时会发生这种情况。无论您在哪里尝试访问项目,都可以使用 if 检查进行处理,如下所示,

if(data && data.length > 0){
  for (let i = 0; i < data.length; i++) {
}

【讨论】:

  • 你需要对所有数组做同样的事情
  • 很确定我已经尝试过了,但是当我打开我的电脑时会再试一次,我会告诉你
  • 是问题所在吗?你解决了吗?
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2019-08-26
  • 2017-12-26
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多