我们正在研究一个角度项目,其中我们有一个组件生成通过getter加载的列表,并且该列表生成使用ngModel指令的输入。每次我们改变输入值时,出于某种原因都重新评估项目列表,并重新渲染我们不想要的组件。Angular NgModel重新评估getter @Input
下面是一个显示此行为的示例。
import {NgModule,ChangeDetectionStrategy,Component,OnChanges,SimpleChanges,Input} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { FormsModule } from '@angular/forms';
@Component({
selector: 'my-app',
template: `
<div>
<test-component [items]="getterList"></test-component>
</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class App implements OnChanges{
staticList = ["a","b","c"];
get getterList():string[]{
console.log('getterList');
return this.staticList.map(a=>a);
}
ngOnChanges(changes:SimpleChanges){
console.log(changes);
}
}
@Component({
selector: 'test-component',
template: `
<div *ngFor="let item of items">
{{item}}
<input type="text" [(ngModel)]="testValue" placeholder="ngModel" />
<input type="text" [value]="testValue" placeholder="no ngModel" />
</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TestComponent {
@Input() items:string[] = [];
testValue:string="";
}
@NgModule({
imports: [ BrowserModule,FormsModule ],
declarations: [ App,TestComponent ],
bootstrap: [ App ]
})
export class AppModule {}
(这里的plunker) https://plnkr.co/edit/MigjRs3MULcNS55oKVpp?p=preview
在这个例子中,我们必须通过一个getter生成的列表。列表中的每个元素生成2个输入;一个与ngModel,其他没有ngModel,我们可以看到,第二个输入不会触发getter。
为什么ngModel指令会重新触发getter?
这里的getter的用例是什么,你需要它来做什么? – Alex
是的,我们从一个实体映射到另一个实体,我们知道我们可以在ngOnInit中做一次,但我们试图理解ngModel为什么会无缘无故地触发getter –