为什么我必须调用 NgZone.run 才能让我的视图在 Angular2 中使用 Breezejs 进行更新?

2023-12-31

我正在尝试学习 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?


Breeze 现在在 Angular2 上运行得很好。我们正在使用当前版本的 Breeze 和 Angular Beta 8 开发一个大型应用程序,没有出现任何问题。

目前唯一的解决办法是,breeze 尚未使用 Angular2 http 提供程序。但是,您可以在默认的“Q”提供程序中进行填充,以便它支持 Angular2 期望的 ES6 Promise,代码如下:

/**
 * Minimum necessary deferred object for breeze Q/ES6 Promise adapter
 * Makes ES6 promise look like Q. 
 */
export interface Deferred {
    promise: Promise<any>;
    resolve: (value?: {} | PromiseLike<{}>) => void;
    reject: (reason?: any) => void;
}

/**
 * Minimum for breeze breeze Q/ES6 Promise adapter
 */
export const Q = {
    defer(): Deferred {
        let resolve: (value?: {} | PromiseLike<{}>) => void;
        let reject: (reason?: any) => void;
        let promise = new Promise((_resolve, _reject) => {
            resolve = _resolve;
            reject = _reject;
        })
        return {
            promise: promise,
            resolve(value: any) { resolve(value); },
            reject(reason: any) { reject(reason); }
        }
    },

    resolve(value?: {} | PromiseLike<{}>) {
        let deferred: Deferred = Q['defer']();
        deferred.resolve(value);
        return deferred.promise;
    },


    reject(reason?: any) {
        let deferred: Deferred = Q['defer']();
        deferred.reject(reason);
        return deferred.promise;
    }
}

然后您可以导入该文件

import { Q } from './q';

然后在你的应用程序顶部附近的某个地方

breeze.config.setQ(<breeze.promises.IPromiseService>Q);

此时,所有标准的微风方法都可以像现在一样工作,并且 Angular 的更改检测也应该没有问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我必须调用 NgZone.run 才能让我的视图在 Angular2 中使用 Breezejs 进行更新? 的相关文章

随机推荐

  • 如何使用加密密码连接到 PostgreSQL 服务器

    在通常的情况下 连接字符串包含纯文本的密码 但这可以被Wireshark捕获 所以我想在连接字符串中使用加密的密码 我从 Postgres 文档中找到了以下摘录 通过网络加密密码MD5认证方式 在将密码发送到客户端之前 在客户端对密码进行双
  • c - 返回状态/值的适当范围

    最近在看一本关于linux编程的书时 得到这样的信息 exit 的 status 参数定义了进程的终止状态 当该进程的父进程调用 wait 时 该状态可用 尽管定义为 int 但实际上只有状态的底部 8 位可供父级使用 并且只有0 127建
  • DelayedJob 错误:已经有一个或多个程序实例正在运行

    一些背景故事 昨晚 当delayed job工作人员正在处理图像处理作业时 我的服务器磁盘空间不足 当我尝试阻止工作人员时 我得到的答复是 已终止 RAILS ENV production script delayed job stop T
  • 如何突出显示 UIButton 子类?

    我有一个子类UIButton我覆盖的地方drawRect用于自定义外观的按钮 但现在单元格不突出显示 我怎样才能解决这个问题 我已经为按下单元格时的另一个自定义绘制矩形准备好了代码 void drawRect CGRect rect Gen
  • 为什么 scala 不推断继承特征的类型成员?

    我有一组类型 每个类型都有自己的类型成员 sealed trait FieldType type Data def parse in String Option Data object Name extends FieldType type
  • Alpha/透明度和 MTKView?

    我有一个 Metal 片段着色器 它返回一些带有 alpha 通道的透明颜色 我想在 MTKView 下显示一个 UIView 但我得到的唯一背景结果是黑色和 错误噪声 MTL渲染管道描述符 pipelineStateDescriptor
  • Paramiko 相当于管道控制和输入/输出管道

    我需要一种基于 paramiko 的轻量级文件传输方法SSH2 http en wikipedia org wiki SSH2服务器 dropbear http matt ucc asn au dropbear dropbear html
  • 在java中解析CSV

    我遇到了这种奇怪的情况 我必须水平阅读 所以我得到一个 csv 文件 其中包含水平格式的数据 就像下面这样 CompanyName RunDate 10 27 2010 11 12 2010 11 27 2010 12 13 2010 12
  • 斐波那契在 Python 中可以工作,但在 Java 中却失败

    我有这个代码用于计算fibonacci数在python 它有效并给出了预期的结果 但当我把同样的内容翻译成Java 它失败 知道这里出了什么问题吗 In python def fib3 n a b 0 1 while n gt 0 a b
  • 删除了 MacPorts,现在 Python 已损坏

    我已经从我的 Mac 10 7 5 中删除了 MacPorts 现在 Python 似乎已损坏 我正在尝试运行 scrapy 最后出现以下错误 ImportError dlopen Library Python 2 7 site packa
  • 有没有办法为 *any* 枚举声明注释属性?

    目前我正在为 Java Swing 开发一个基于注释的绑定框架 它使用JGoodies 绑定 http www jgoodies com在引擎盖下 不幸的是 我被 JRadioButton 绑定的注释所困扰 我想要做的是指定包含特殊值 枚举
  • 向打字稿声明动态原型方法

    我正在将带有几个 生成的 原型方法的 javascript 类转换为打字稿 生成的方法映射到内部对象 因此 API 对于 80 的用例来说更干净 更方便 但是 我找不到正确告诉打字稿存在哪些方法而不实际实现它们的方法 class A A p
  • Postgresql 全文搜索带撇号的单词

    我正在为 Postgresql 8 4 构建一个定制的 ispell 字典配置 并且在正确解析带有撇号的单词时遇到一些问题 Postgresql 中包含的 ispell 字典包含一个 affix 文件 其中包含一个 M SFX 规则 该规则
  • gemspec 中包含的依赖项未添加到 Rails 引擎中的资产管道中

    我正在编写一个具有一些依赖项的 Rails 引擎 我已经在 gemspec 中指定了依赖项 当我运行时引擎会找到它们bundle install 即 Gemfile lock 看起来正确 当我想在 Ruby 文件中使用该插件时 我可以这样做
  • karma.conf.js 自动文件排序?

    我有一个按功能排序的大型 angularjs 项目 我想设置单元测试 但在获取 karma conf js 文件排序设置时遇到问题 我尝试指定一个简单的 glob 模式 如 js 但我的许多模块由于运行时包含在 Karma 中的顺序而无法加
  • 打包数据类型与普通数据类型之间的差异

    在金属中 a 和 a 之间有什么区别packed float4 and a float4 此信息来自here https developer apple com library ios documentation Metal Referen
  • 单击图像时运行 Javascript

    我的网站上有以下图形按钮 a href class addto cart btn span Click here to add to cart now span a 我想在单击 当前值 时运行特定的 javascript 脚本来运行一些 j
  • 如何在 PHP 中读取从 AngularJS 发送的 POST 请求数据

    我正在尝试从我的角度 js 发出发布请求 如下所示 var postData firstName VenuGopal lastName Kakkula postData JSON stringify postData http method
  • Windows 进程激活服务 (WAS) 将无法启动

    IIS 10 不会在我的电脑上重新启动 当我导航到本地主机时 我收到 本地主机拒绝连接 消息 通过事件查看器查看后 发现问题在于 Windows 进程激活服务 WAS 无法启动 给出的错误信息是 The Windows Process Ac
  • 为什么我必须调用 NgZone.run 才能让我的视图在 Angular2 中使用 Breezejs 进行更新?

    我正在尝试学习 angular2 并使用 odata webapi 后端创建一个测试应用程序 在应用程序中 我有一个视图 它获取一系列项目 我想在我的视图中显示这些项目 为了从前端获取数据 我使用breezejs库 因为事实证明它在过去节省