当前位置: 首页 > 知识库问答 >
问题:

函数中有条件的条件类导致“ExpressionChangedAfterItHasBeenCheckedError”

阮阳曦
2023-03-14

我在组件的列表中显示了一个项目数组。项目的属性之一是描述字段,其范围可以从一个单词到几个句子。

当描述太长,我想截断它,并显示一个按钮,将显示点击时的完整文本。是否截断和显示按钮的条件基于返回布尔值的函数:

checkOverflow(element) {
  if (element.offsetHeight < element.scrollHeight ||
    element.offsetWidth < element.scrollWidth) {
    return true;
  } else {
    return false;
  }
}

然后我从组件的模板端使用这个函数,如下所示(ngFor的一小部分):

 <p #refDescription
    class="item-description--max-height"
    [class.fade--read-more]="checkOverflow(refDescription)">
        {{item.description}}
 </p>
 <button class="button button--read-more" *ngIf="checkOverflow(refDescription">Read more</button>

这里使用的CSS很简单:

.item-description--max-height {
  font-size: 20px;
  @include font-fira-sans-italic;
  line-height: 28px;
  margin-bottom: 0;  
  max-height: 2.9em;
  overflow: hidden;
}

.fade--read-more {
  height: 2.9em; /* exactly two lines */
}

目前,该行为非常偶然,我在控制台中收到错误:

expressionchangedafterithasbeencheckedererror:检查后表达式已更改。以前的值:“ngIf: false”。当前值:“ngIf: true”。

我相信我将类绑定到函数是错误的轨道 - 非常感谢任何建议。我正在使用 Angular 版本 7。

谢谢。

共有1个答案

魏澄邈
2023-03-14

通常,此错误是由模板内部调用的方法引起的。

尝试将checkOverflow()调用移动到组件中:

// use view children to get references to dom elements
@ViewChildren('refDescription') descRef: QueryList<ElementRef>;

ngAfterViewInit(): void {
  // wait when dom rendered
  setTimeout(() => {
    // get dom elements
    const elements = this.descRef.toArray().map(i => i.nativeElement);
    // check overflow and put result into 'overflow' property
    elements.forEach((el, index) => {
      this.items[index]['overflow'] = this.isOverflow(el); 
    });
  });
}

相应地更新模板:

<p #refDescription
    class="item-description--max-height"
    [class.fade--read-more]="item.overflow">
        {{item.description}}
 </p>
 <button class="button button--read-more" *ngIf="item.overflow">Read more</button>
 类似资料:
  • 我正在一个项目中使用phpExcel类。 我创建了一个模型文件,在它的第二个工作表中包含了一些公式,它从第一个工作表中获取了数据。我正在用phpexcel将所有数据写入第一张表中。大多数公式都很好用,但有一个公式引起了一个问题,那就是 对于Excel2007,在更新的Excel版本中,语法不同,如 我也试着用phpExcel把这两个公式写到单元格里,但也没有用。当我使用这个公式时,我没有得到任何错

  • 代码如上,子查询能正常执行。问题是整个执行时一直无反应,也不报错,一直显示正在查询,去掉子查询里的group by 就能正常执行,请问是什么原因?

  • 我的角码出了什么问题?我得到以下错误: 无法读取BrowserDomAdapter.RemoveClass中未定义的属性“Remove”

  • 问题内容: 我之前曾问过,但情况已经改变,今天我意识到我之前获得的解决方案存在严重问题。我的算法有些变化。 这是新代码: 使用此解决方案,每次我在FutureBuilder中有条件渲染的页面中导航时,BootScreen页面函数都会执行。所以这不是最好的…我需要在Future Builder内部执行导航而没有任何问题,如下所示: 因为返回值不是小部件,所以它当然不起作用。有什么办法吗? 编辑:感谢

  • 本小节介绍 MySQL 提供的 IF、IFNULL、CASE 三种条件判断函数或结构,条件判断是为了实现控制流,在不同的条件下执行不同的流程。 1.IF函数 以 student 表为例,使用 IF() 函数对查询结果的字段判断: SELECT name,IF(age > 17,'成年','未成年') AS age_group,id_number FROM student; 查询结果如下图: Ti

  • 我需要 在Hibernate条件中。由于这个问题,我知道如何将分组结果作为的列表: 我不知道如何添加HAVING子句。我想,它类似于,但是我如何引用计数呢? 有没有办法在查询中引用结果元组元素?