我們正在研究一個角度項目,其中我們有一個組件生成通過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 –