Angular 5 来自其他组件的输入数组,导致长度为 0
Angular 5 input array from other component , cause length 0
我把从服务中收集的数据放到数组中。我通过 @Input 将这个数组放入第二个组件,但在其中数组而不是长度 18 有 0;
TS:
arr: Datas[] = [];
constructor(private dataService: DataService) {
}
ngOnInit() {
console.log("ng init");
this.getArraysFromData();
}
getArraysFromData() {
this.DataService.getDatas().subscribe((data: Datas[]) => {
for (let item of data) {
this.arr.push(item);
}
console.log("smartlamps from Map ", this.arr);
});
}
}
HTML :
<app-osm-generator [dataInput]="arr"></app-osm-generator>
我输入的组件
@Input() dataInput: Datas[];
ngOnInit(): void {
this.takeDataFromInput();
}
takeDataFromInput() {
console.log(this.dataInput.length); <-- is 0 must be 18
for(let item of dataInput) {
console.log(item);
}
}
添加一个ngIf
<app-osm-generator *ngIf="arr" [dataInput]="arr"></app-osm-generator>
你得到 console.log(dataInput.length);
因为它在分配数据之前被调用
有两种方法可以解决问题:
1) 仅当数据可用时才包含 app-osm-generator
<app-osm-generator *ngIf="arr.length > 0" [dataInput]="arr"></app-osm-generator>
2) implements OnChanges
ngOnChanges(changes: SimpleChanges) {
let data = changes.dataInput;
console.log('prev value: ', data.previousValue);
console.log('got name: ', data.currentValue);
console.log(data.length);
}
检查控制台将消除您对流程的所有疑虑
有关第二种方法的更多详细信息:READ
建议:
this.DataService.getDatas().subscribe((data: Datas[]) => {
this.arr = [ ...this.arr , ...data]; // instead of looping try out ES6's feature
console.log("smartlamps from Map ", this.arr);
});
我不知道这个问题是否有误,但不是 this.DataService 因为 DataService 是服务声明而 dataService 是注入的实例..
this.DataService.getDatas().subscribe((data: Datas[]) => {
for (let item of data) {
this.arr.push(item);
}
console.log("smartlamps from Map ", this.item);
好:
this.dataService.getDatas().subscribe((data: Datas[]) => { // good!
for (let item of data) {
this.arr.push(item);
}
console.log("smartlamps from Map ", this.item);
我把从服务中收集的数据放到数组中。我通过 @Input 将这个数组放入第二个组件,但在其中数组而不是长度 18 有 0;
TS:
arr: Datas[] = [];
constructor(private dataService: DataService) {
}
ngOnInit() {
console.log("ng init");
this.getArraysFromData();
}
getArraysFromData() {
this.DataService.getDatas().subscribe((data: Datas[]) => {
for (let item of data) {
this.arr.push(item);
}
console.log("smartlamps from Map ", this.arr);
});
}
}
HTML :
<app-osm-generator [dataInput]="arr"></app-osm-generator>
我输入的组件
@Input() dataInput: Datas[];
ngOnInit(): void {
this.takeDataFromInput();
}
takeDataFromInput() {
console.log(this.dataInput.length); <-- is 0 must be 18
for(let item of dataInput) {
console.log(item);
}
}
添加一个ngIf
<app-osm-generator *ngIf="arr" [dataInput]="arr"></app-osm-generator>
你得到 console.log(dataInput.length);
因为它在分配数据之前被调用
有两种方法可以解决问题:
1) 仅当数据可用时才包含 app-osm-generator
<app-osm-generator *ngIf="arr.length > 0" [dataInput]="arr"></app-osm-generator>
2) implements OnChanges
ngOnChanges(changes: SimpleChanges) {
let data = changes.dataInput;
console.log('prev value: ', data.previousValue);
console.log('got name: ', data.currentValue);
console.log(data.length);
}
检查控制台将消除您对流程的所有疑虑
有关第二种方法的更多详细信息:READ
建议:
this.DataService.getDatas().subscribe((data: Datas[]) => {
this.arr = [ ...this.arr , ...data]; // instead of looping try out ES6's feature
console.log("smartlamps from Map ", this.arr);
});
我不知道这个问题是否有误,但不是 this.DataService 因为 DataService 是服务声明而 dataService 是注入的实例..
this.DataService.getDatas().subscribe((data: Datas[]) => {
for (let item of data) {
this.arr.push(item);
}
console.log("smartlamps from Map ", this.item);
好:
this.dataService.getDatas().subscribe((data: Datas[]) => { // good!
for (let item of data) {
this.arr.push(item);
}
console.log("smartlamps from Map ", this.item);