【发布时间】:2016-01-04 19:05:26
【问题描述】:
我有一个通过 firebase 获取一些对象的服务。然后它会填充一个数组,然后应该提示 angular 使用 *ngFor 语句更新 DOM,但它不起作用。代码如下:
TeachersService
import {Injectable} from 'angular2/core';
import {Teacher} from './teacher.ts';
@Injectable()
export class TeachersService {
private firebaseURL: string;
private teachersRef: Firebase;
constructor() {
this.firebaseURL = "https://xyz.firebaseio.com/teachers";
this.teachersRef = new Firebase(this.firebaseURL);
}
getTeachers() {
this.teachersRef.on("value", function(snapshot) {
var tempArr = new Array(snapshot.numChildren());
// this.teachers = snapshot.val();
snapshot.forEach(function(data) {
var teacher = {
name: data.key(),
position: data.val().stilling
}
tempArr.push(teacher);
});
// this.teachers = tempArr;
console.log(tempArr);
return Promise.resolve(tempArr);
});
return Promise.resolve([]);
}
}
还有Teachers
import {Component, AfterViewInit, OnInit, View} from 'angular2/core';
import {NgFor} from 'angular2/common';
import {Router} from 'angular2/router';
import {TeachersService} from '../../services/teachers.service';
@Component({
selector: 'teachers',
templateUrl: './components/teachers/teachers.html',
providers: [TeachersService]
})
export class TeachersCmp implements AfterViewInit, OnInit {
private firebaseURL: string;
private teachersRef: Firebase;
public teachers: Array<any>;
constructor(
private _router: Router,
private _teachersService: TeachersService
) {}
ngOnInit() {
this.populateTeachersArr();
}
populateTeachersArr() {
this._teachersService.getTeachers().then(teachers => this.teachers = teachers);
}
}
Teachers.html
<ul>
<li *ngFor="#teacher of teachers">
<strong>{{teacher.name}}</strong>: {{teacher.position}}
</li>
我怀疑这与变更检测有关(或者至少我对它的理解)。但是不知道怎么提示ng2检测数组更新。如果我创建了一个静态数组,例如:[1,2,3,4],*ngFor 语句可以正常工作并像在 DOM 中一样显示它。
【问题讨论】:
-
它肯定是@GünterZöchbauer。但是有点厚,你能提供一个如何实现的例子吗?
-
我认为问题出在您在
getTeachers函数中使用承诺的方式(请参阅我的回答),并且与变更检测无关......
标签: angular