Angular2 NgFor在表达式中绑定数组

Posted

技术标签:

【中文标题】Angular2 NgFor在表达式中绑定数组【英文标题】:Angular2 NgFor bind array in expression 【发布时间】:2017-05-08 22:38:36 【问题描述】:

ngfor 循环中使用的数组,当它更新时,如何让 Angular2 重新运行该表达式?目前它不会输出任何东西,因为它在开始时使用空数组运行 - 一旦更新(数组已更改),ngfor 表达式不会重新运行 - 这是所需的功能。这是怎么做到的?

例如在组件html中;

<option *ngFor="let user of users" [value]="user.id">user.name</option>

在组件 TS 中我们声明了一个属性;

users: IUser[] = [];

在 ngOnInit 中,我们调用了一个返回用户数据的 TS 服务;

this.userDataService.getUsers().subscribe(data => 
    this.users = data;
);

更新的代码示例;

@Component(
  selector: 'app-manage-user',
  templateUrl: './user-form.component.html',
  providers: [UsersDataService]
)
export class UserFormComponent implements OnInit 

  constructor(private userDataService: UsersDataService) 

  

  users: IUser[] = []; 

  ngOnInit() 
    this.userDataService.getUsers().subscribe(user => 
      this.users = user;
    );
  

【问题讨论】:

“更新”是什么意思?当你“更新”你的数组时,为什么不调用this.userDataService.getUsers.... 方法呢? 我们不能调用 getUsers 函数并直接分配给 user 属性,因为 getUsers 返回一个 observable。 *ngFor 每次运行更改检测时都会检查数组的更改并相应地更新 DOM。您是在使用上面的 ngOnInit 代码还是在您的实际代码中更复杂? 【参考方案1】:

您可以使用 ChangeDetectorRef 来检测更改。

import ChangeDetectorRef from '@angular/core';

在你的构造函数中注入它,当数组的值改变时调用detectChanges()方法:

  constructor(private userDataService: UsersDataService, private changeDetector: ChangeDetectorRef) 

  

  users: IUser[] = []; 

  ngOnInit() 
    this.userDataService.getUsers().subscribe(user => 
      this.users = user;
      this.changeDetector.detectChanges();
    );
  

【讨论】:

啊,是的,我忘记了变化检测器!真的非常感谢。【参考方案2】:

我建议像这样使用它:

<select *ngIf="users.length >0">
<option *ngFor="let user of users" [value]="user.id">user.name</option>
</select

【讨论】:

【参考方案3】:

你可以检查一下,因为请求快速数组没有更新:

ngOnInit() 
    this.userDataService.getUsers().subscribe(user => 
      if(user)
        this.users = user;
      
    );
  

【讨论】:

以上是关于Angular2 NgFor在表达式中绑定数组的主要内容,如果未能解决你的问题,请参考以下文章

ngFor内的Angular2 ngModel

<input> 元素中的“name”属性与 *ngFor 的 Angular2 绑定

Angular 2 - NgFor 中与 NgModel 的 2 路绑定

复选框ngFor Angular2上的双向绑定

Angular2 单个 ngFor 用于多个数组

Angular2,Ionic2:如何使用 ngModel 对嵌套 *ngfor 中的单选按钮进行 2way 绑定?