gpt4 book ai didi

Angular:如何订阅@Input 更改

转载 作者:太空狗 更新时间:2023-10-29 18:15:42 26 4
gpt4 key购买 nike

我正在尝试创建一个 Angular 组件,它使用提供的对象数组呈现一个 html 表格。

我已经实现了 OnChanges 来检测对 @Input 的更改,但它似乎不起作用。

为了测试,我正在使用 setInterval 添加一些数据,但它没有反射(reflect)在子组件中。

这是我目前的代码,

ng-table.component.ts:

export class NgTableComponent implements OnInit, OnChanges {

@Input() data: any[];

private columns: string[];
private rows: string[][];

constructor() {
this.columns = [];
this.rows = [];
}

ngOnInit() {
}

ngOnChanges(changes: SimpleChanges) {
console.log(changes);
if (changes.data) {
this.extractRowsAndColumns(this.data);
}
}

extractRowsAndColumns(objArray: any[]): void {
const colSet = new Set<string>();
for (let i = 0; i < objArray.length; i++) {
const keys = Object.keys(objArray[i]);
for (let j = 0; j < keys.length; j++) {
colSet.add(keys[j]);
}
}
this.columns = Array.from(colSet);

for (let i = 0; i < objArray.length; i++) {
const obj = objArray[i];
const row = [];
for (let j = 0; j < this.columns.length; j++) {
if (obj.hasOwnProperty(this.columns[j])) {
row.push(obj[this.columns[j]]);
} else {
row.push(null);
}
}
this.rows.push(row);
}
}
}

ng-table.component.html:

<div>
<table class="ngtable">
<tr>
<th *ngFor="let col of columns">
{{col}}
</th>
</tr>
<tr *ngFor="let row of rows">
<td *ngFor="let cell of row">{{cell}}</td>
</tr>
</table>
</div>

我在 app.component 中使用上面的组件

app.component.ts:

export class AppComponent {
timer: any;
count = 0;
constructor() {
const o: any = {
'id': 1,
'name': 'Jeanette',
'last_name': 'Penddreth',
'email': 'jpenddreth0@census.gov',
'gender': 'Female',
'ip_address': '26.58.193.2'
};
this.timer = setInterval(() => {
this.data.push(o);
console.log(this.data.length);
if ( this.count++ === 5) {
clearInterval(this.timer);
}
}, 1000 * 1);
}

data = [{
'id': 1,
'name': 'Jeanette',
'last_name': 'Penddreth',
'email': 'jpenddreth0@census.gov',
'gender': 'Female',
'ip_address': '26.58.193.2'
}, {
'id': 2,
'name': 'Giavani',
'last_name': 'Frediani',
'email': 'gfrediani1@senate.gov',
'gender': 'Male',
'ip_address': '229.179.4.212'
}, {
'id': 3,
'name': 'Noell',
'last_name': 'Bea',
'email': 'nbea2@imageshack.us',
'gender': 'Female',
'ip_address': '180.66.162.255'
}, {
'id': 4,
'name': 'Willard',
'last_name': 'Valek',
'email': 'wvalek3@vk.com',
'gender': 'Male',
'ip_address': '67.76.188.26'
}];
}

app.component.html:

<app-ng-table [data]="data"></app-ng-table>

如何在@Input 发生变化时更新组件?

更新:我创建了一个 plunkr 来演示:https://plnkr.co/edit/szz1SNooQ1vIZhnFgiys?p=preview

最佳答案

只需使您的@Input() 双向绑定(bind)...

_data;
@Input() set data(val) {
this._data = val;
}
get data() {
return this._data;
}

关于Angular:如何订阅@Input 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com