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

*ngIF和*ngFor在同一元素上导致错误

杨阳飇
2023-03-14

我有一个问题,试图在同一个元素上使用Angular的*ngFor*ngIF

当尝试在*ngFor中循环遍历集合时,该集合被视为null,因此在尝试访问模板中的属性时失败。

@Component({
  selector: 'shell',
  template: `
    <h3>Shell</h3><button (click)="toggle()">Toggle!</button>

    <div *ngIf="show" *ngFor="let thing of stuff">
      {{log(thing)}}
      <span>{{thing.name}}</span>
    </div>
  `
})

export class ShellComponent implements OnInit {

  public stuff:any[] = [];
  public show:boolean = false;

  constructor() {}

  ngOnInit() {
    this.stuff = [
      { name: 'abc', id: 1 },
      { name: 'huo', id: 2 },
      { name: 'bar', id: 3 },
      { name: 'foo', id: 4 },
      { name: 'thing', id: 5 },
      { name: 'other', id: 6 },
    ]
  }

  toggle() {
    this.show = !this.show;
  }

  log(thing) {
    console.log(thing);
  }

}

我知道简单的解决方案是将*ngIf向上移动一个级别,但是对于像在ul中循环列表项这样的场景,如果集合是空的,我会得到一个空的li,或者我的li被包装在冗余容器元素中。

示例在这个plnkr。

注意控制台错误:

EXCEPTION: TypeError: Cannot read property 'name' of null in [{{thing.name}} in ShellComponent@5:12]

我做错什么了还是这是一个错误?

共有3个答案

邹祺然
2023-03-14

正如@Zyzle和@Günter在评论(https://github.com/angular/angular/issues/7315)中提到的,这是不支持的。

具有

<ul *ngIf="show">
  <li *ngFor="let thing of stuff">
    {{log(thing)}}
    <span>{{thing.name}}</span>
  </li>
</ul>

没有空的

填充列表时,没有多余的容器元素。

@Zyzle在评论中提到的github讨论(4792)也提供了另一个使用

<template [ngIf]="show">
  <div *ngFor="let thing of stuff">
    {{log(thing)}}
    <span>{{thing.name}}</span>
  </div>
</template>

此解决方案也不会引入任何额外/冗余的容器元素。

劳通
2023-03-14

正如每个人所指出的,即使在一个元素中有多个模板指令在角1. x中工作,但在角2中是不允许的。你可以从这里找到更多信息:https://github.com/angular/angular/issues/7315

解决方案是使用

<template *ngFor="let nav_link of defaultLinks"  >
   <li *ngIf="nav_link.visible">
       .....
   </li>
</template>

但由于某些原因,上述方法在2.0.0-rc中不起作用。4在这种情况下,您可以使用

<template ngFor let-nav_link [ngForOf]="defaultLinks" >
   <li *ngIf="nav_link.visible">
       .....
   </li> 
</template>

有了更新,现在我们建议在2018年使用

这是最新的答案。

<ng-container *ngFor="let nav_link of defaultLinks" >
   <li *ngIf="nav_link.visible">
       .....
   </li> 
</ng-container>

翟俊哲
2023-03-14

Angular v2在同一个元素上不支持多个结构指令
使用

<ng-container *ngIf="show">
  <div *ngFor="let thing of stuff">
    {{log(thing)}}
    <span>{{thing.name}}</span>
  </div>
</ng-container>
<ng-template [ngIf]="show">
  <div *ngFor="let thing of stuff">
    {{log(thing)}}
    <span>{{thing.name}}</span>
  </div>
</ng-template>

 类似资料:
  • 当我在同一个元素上使用和时,我遇到了一个问题。 我知道简单的解决方案是在新元素上移动。例如: 但是当我使用这个解决方案时,我不能使用变量。并且这个解决方案隐藏了

  • 我遇到需要 *ngIf 和 *ngFor 指令的情况。我在堆栈上找到了很多答案,但对于这种情况没有答案。 我有一个表格,我在其中循环浏览对象数组并在标题中动态写入单元格: 我想显示/隐藏对象是否包含设置为 true 的可见值。我怎样才能做到这一点?

  • 在我的 Angular 5 应用程序中,我正在循环创建 元素: 但是我只想在满足某些条件的情况下显示该行。我知道我不能一起使用和,但我不知道如何绕过这个问题。 我看到一篇文章说使用构造在tr中添加一个模板,但这似乎不再是有效的语法。如果我这样尝试: 然后我得到运行时错误。 应用组件。html:14错误错误:StaticInjectorError(AppModule)[NgIf-

  • 伙计们,你们能帮帮忙吗 所以我正在尝试显示我从后端获得的数据,但似乎 *ngFor 不起作用,只想返回启用的大小如何使用 ngIf 这是模板 这是我得到的数据(我正在循环的部分) 所以我需要显示每个尺寸的价格,然后减去折扣,如果未启用,则显示隐藏该尺寸。

  • 我试图使用ngFor显示选项列表,但只满足某些条件,是否可以一起使用ngFor和ngIF来实现这一点?

  • 在下面的代码中,我试图在< code >选项卡下显示所有< code >项目(对象),它们应该基于它们的类别。 类别必须相等。 编辑:如果还不清楚,请看这里。 我正在尝试遍历选项卡并将每个选项卡的名称添加到选项卡的“模板”中。 然后,我尝试遍历项目,如果项目的类别与选项卡的类别匹配,那么它将显示在选项卡下。 出于某种原因,它似乎不起作用。我做错什么了吗?< br >请原谅我和我的逻辑,过去两天一直