每当组件生命周期或模板中的ngOnChanges()
变量发生更改但无法正常工作时,我都试图在Angular 5.x组件中调用this.test
函数,但没有随时调用ngOnChanges()
函数。有人可以帮我吗?
src / app.ts:
import {Component, NgModule, Input, OnChanges, SimpleChanges} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
@Component({
selector: 'my-app',
template: `
<div>
<input type="text" placeholder="Test field" value="{{ test }}">
</div>
`,
})
export class App implements OnChanges {
@Input() test: string;
name: string;
constructor() {
}
ngOnChanges(changes: SimpleChanges) {
console.log('ngOnChanges');
if (changes.test && !changes.test.isFirstChange()) {
// exteranl API call or more preprocessing...
}
for (let propName in changes) {
let change = changes[propName];
console.dir(change);
if(change.isFirstChange()) {
console.log(`first change: ${propName}`);
} else {
console.log(`prev: ${change.previousValue}, cur: ${change.currentValue}`);
}
}
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
实时预览:https://plnkr.co/edit/ZHFOXFhEkSv2f1U3lehv
非常感谢!
最佳答案
输入属性为父组件提供了一种将数据传递给子组件的机制。它们无意将数据从模板传递到其组件。
并且只有对由PARENT定义的输入属性的更改才会生成onChanges方法。
我更新了插件,以修复缺少的FormsModule并添加了一个子组件来演示如何使用input属性和onChanges生命周期挂钩:
https://plnkr.co/edit/1JF0wV28HnjXDZxMSifY?p=preview
子组件
@Component({
selector: 'my-child',
template: `
<div>
<input type="text" [(ngModel)]="test" placeholder="Test field">
</div>
`,
})
export class ChildComponent implements OnChanges {
@Input() test: string;
name: string;
constructor() { }
ngOnChanges(changes: SimpleChanges) {
console.log('in ngOnChanges');
if (changes.test && !changes.test.isFirstChange()) {
// exteranl API call or more preprocessing...
}
for (let propName in changes) {
let change = changes[propName];
console.dir(change);
if(change.isFirstChange()) {
console.log(`first change: ${propName}`);
} else {
console.log(`prev: ${change.previousValue}, cur: ${change.currentValue}`);
}
}
}
}
父组件
@Component({
selector: 'my-app',
template: `
<div>
<h2>Hello {{name}}</h2>
<my-child [test]='parentTest'></my-child>
<button (click)='onClick()'>Change Value</button>
</div>
`,
})
export class App {
parentTest: string;
name: string;
counter = 1;
constructor() {
this.name = `Angular! v${VERSION.full}`
}
onClick() {
this.parentTest = `test: ${this.counter}`;
this.counter++;
}
}
要从模板组件中的模板捕获更改,请改用setter:
// To catch changes from the template
_test: string;
get test(): string {
return this._test;
}
@Input()
set test(value: string) {
this._test = value;
console.log("Textbox value changed: " + this._test);
}
或者,您可以使用Sajeetharan的建议在其关联的模板中捕获模板的更改。它也将起作用。