ngFor如何区分同一类的两个实例?Angular组件迭代疑问
ngFor 与组件实例的疑问 我已花费数小时阅读大量关于ngFor的文档和示例,发现它们的操作流程完全一致:定义类、导出类并执行迭代。以下是示例代码:
模板代码
<h1>{{title}}</h1> <form> <input type="text" name="nombre" [(ngModel)]= "nombre"><br/> <input type="text" name="apellido" [(ngModel)]= "apellido"><br/> <input type="submit" name="registrar" (click)="Register()"><br/> </form> <br/> <p *ngIf="registered; else notregistered">{{message}} con el nombre de {{nombre}} {{apellido}}</p> <ng-template #notregistered> <p>nadie registrado</p> </ng-template> <br/> <br/> <ul> <li *ngFor='let entry of entrys'>{{entry.title}}</li> </ul>
组件代码
interface Entrys{ title:string } export class AppComponent { title = 'Registro'; message = ''; registered = false; nombre:string = ""; apellido:string = ""; entrys:Entrys[]; constructor(){ this.entrys=[ {title:"hola1"}, {title:"hola2"}, {title:"hola3"}, {title:"hola4"}, {title:"hola5"}, {title:"hola6"}, ] } Register() { this.registered = true; this.message = "user registered" } }
我的问题是:若声明并初始化两个值不同的AppComponent对象,ngFor会如何处理?据现有文档来看,ngFor似乎无法区分这些对象。抱歉表述可能欠严谨,我正用手机编辑且刚学习Angular。
解答
组件实例的独立性
Angular中每个组件实例都是完全独立的,拥有自己专属的属性和状态。当你创建两个AppComponent实例时,它们各自的entrys数组、registered状态等都是隔离的,互相不会影响。每个实例的ngFor只会迭代自身实例内的entrys数组,各自渲染对应的列表内容。ngFor的追踪逻辑
你觉得ngFor无法区分对象,核心是因为默认情况下ngFor通过对象引用来追踪列表项。如果你的数组里存在两个内容相同但引用不同的对象,ngFor会判定它们是不同的项;但如果是同一个对象被重复添加到数组中,ngFor会因为引用相同而无法正确识别变化——这种场景下可以通过trackBy函数自定义追踪规则(比如基于title字段),让ngFor能准确区分不同项。
但回到你的问题本身:两个独立的组件实例之间不存在ngFor需要区分的情况,因为它们的作用域完全隔离,各自处理自己的数据。比如第一个实例的entrys是[{title: "hola1"}, {title: "hola2"}],第二个实例的entrys是[{title: "test1"}, {title: "test2"}],那么两个实例的列表会分别渲染各自的内容,完全独立。
- 补充说明
常规Angular项目中,根组件AppComponent通常只会被实例化一次。如果要创建多个同类型组件实例,一般是将其作为子组件在其他模板中多次调用,或者通过动态组件API创建,无论哪种方式,每个实例的内部状态都是独立的。
内容的提问来源于stack exchange,提问作者Sergio Durán Vega

