Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了angular – 我怎样才能“修补”一个Observable for Zone.js?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个Angular 2组件,当使用某个Observable模式时,Angular的变化检测对我不起作用.它看起来像这样
let getResult$= this.http.get('/api/identity-setTings');

    let manager$= getResult$
        .map((responsE) => /* -- create manager object -- */);

    let signinResponse$= manager$
        .flatMap(manager => manager.processSigninResponse());

    this.readyToLogin$= manager$.map(() => truE).startWith(false);
    this.isLoggedIn$= signinResponse$.map(() => truE).startWith(false);

然后在我的模板中:

<h1>ready to Log In: {{readyToLogin$| async}}</h1>
<h1>Logged In: {{isLoggedIn$| async}}</h1>

由于readyToLogin $Observable基于响应http.get()而发生的同步操作集(Angular“monkey patches”以确保它知道何时需要检测更改),“准备登录”消息在适当的时间切换为true.

但是,由于processSignInResponse()产生Promise<>,所以订阅flatMap结果的任何内容都与http请求的完成事件异步发生.因此,它需要手动干预以通知组件的区域它需要检查更改.

如何在NgZone知道在任何订阅被解析后检测更改的方式包装signInResponse $observable?

更新

布兰登的答案一直有效,直到我更新到RC5,此时事情再次停止了.结果是the 3rd-party library I was using borked Zone.js.一旦解决了,根本没有必要使用变通方法 – 内置的猴子修补工作正常!

可以创建一个新的observeOnZone运算符,可用于“猴子补丁”任何可观察的.就像是:
Rx.observable.prototype.observeOnZone = function (zonE) {
    return Observable.create(observer => {
        var onNext = (@R_607_7548@ => zone.run(() => observer.next(@R_607_7548@);
        var onError = (E) => zone.run(() => observer.error(E));
        var onComplete = () => zone.run(() => observer.complete());
        return this.subscribe(onNext,onError,onCompletE);
    });
};

并像这样使用它:

this.isLoggedIn$= signinResponse$.map(() => truE).startWith(false).observeOnZone(zonE);

大佬总结

以上是大佬教程为你收集整理的angular – 我怎样才能“修补”一个Observable for Zone.js?全部内容,希望文章能够帮你解决angular – 我怎样才能“修补”一个Observable for Zone.js?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。