打字稿 – 为什么我要调用NgZone.run来查看使用breezejs在Angula
我正在尝试学习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'])); } 然后最终存储库调用(通用)datacontext,它将使用breeze entitymanager执行查询: 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自动为我看到这个. 我缺少什么或者我必须实现什么才能在不调用zone.run的情况下自动更新视图?
Angular在修补了大多数异步API的区域中运行.完成异步调用时,Angular运行会更改检测.
以某种方式,微风代码离开Angulars区域并“中断”变化检测.这可能是因为您从Angular外部初始化breeze或者breeze使用了一些未经Angulars区域修补的异步API,因此回调在Angulars区域外执行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |