打字稿 – 为什么我要调用NgZone.run来查看使用breezejs在Angular2中更新?

前端之家收集整理的这篇文章主要介绍了打字稿 – 为什么我要调用NgZone.run来查看使用breezejs在Angular2中更新?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试学习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自动为我看到这个.
我已经挖掘了几个类似的问题,但还没找到答案.我还包括了另一个线程中建议的angular2-polyfills脚本,但是没有解决它.

我缺少什么或者我必须实现什么才能在不调用zone.run的情况下自动更新视图?

Angular在修补了大多数异步API的区域中运行.完成异步调用时,Angular运行会更改检测.

以某种方式,微风代码离开Angulars区域并“中断”变化检测.这可能是因为您从Angular外部初始化breeze或者breeze使用了一些未经Angulars区域修补的异步API,因此回调在Angulars区域外执行.

原文链接:https://www.f2er.com/angularjs/142267.html

猜你在找的Angularjs相关文章