我正在尝试学习 angular2 并使用 odata webapi 后端创建一个测试应用程序。
在应用程序中,我有一个视图,它获取一系列项目,我想在我的视图中显示这些项目。
为了从前端获取数据,我使用breezejs库,因为事实证明它在过去节省了我很多时间,而且我喜欢将它与odata后端一起使用。
调用树和应用程序结构如下所示:
调用首先从视图调用服务函数以开始获取项目(请注意,我从每次调用中返回 es-6 承诺):
this._scrumModuleService.fetchActiveSessions().then((sessions: ScrumSession[]) => {
// Here i have to call zone.run else my view wont update.
this._zone.run(() => {
this.sessions = sessions;
});
}).catch((error: any) => {
debugger;
});
然后从视图中它将转到服务,该服务又调用存储库:
public fetchActiveSessions(): Promise<ScrumSession[]> {
return this._scrumSessionRepository.fetchActiveSessions();
}
存储库获取功能:
public fetchActiveSessions(): Promise<ScrumSession[]> {
return this._dataContext.fetch(new breeze.EntityQuery().from("ScrumSessions").expand(['creator', 'scrumRoom','productOwner', 'users']));
}
然后最终存储库调用(通用)数据上下文,该数据上下文将使用微风实体管理器执行查询:
public fetch(query: breeze.EntityQuery, isRetry: boolean = false): Promise<any> {
return new Promise((resolve, reject) => {
this.entityManager.executeQuery(query).then((result: breeze.QueryResult): void => {
// Data has been fetched, resolve the results
resolve(result.results);
});
});
}
现在,正如您在视图中看到的那样,我必须使用 NgZone 中的 run 函数,否则我的视图将不会更新。我想知道为什么我必须这样做,因为我期望 Angular2 自动为我看到这个。
我已经挖掘了几个类似的问题,但还没有真正找到答案。我还按照另一个线程中的建议包含了 angular2-polyfills 脚本,但这并没有解决它。
我缺少什么或者我必须实现什么才能让我的视图自动更新而无需调用 zone.run?