当前位置: 首页 > 知识库问答 >
问题:

如何在rxjs Observable中包装$http promise调用时刷新视图

施慈
2023-03-14

我有一个项目,使用角的$超文本传输协议服务从远程位置加载数据。我想使用rxjs的可观察性,所以我的服务中的调用看起来像这样:

    userInfo() : Rx.Observable<IUserInfo> {
        var url : string = someUrl + this._accessToken;

        return Rx.Observable.fromPromise<IUserInfo>( this.$http.get<IUserInfo>( url ) );
    }

这是我的控制器订阅的,如下所示:

    getUserInfo() : void {
        this._googleService.userInfo().subscribe(
            ( result ) => { this.handleUserInfo( result ) },
            ( fault : string ) => this.handleError( fault )
        )
    }

    private handleUserInfo( result : IHttpPromiseCallbackArg<IUserInfo> ) : void {
        console.log( "User info received at " + new Date() );

        this._name = result.data.given_name + " " + result.data.family_name;
        this._email = result.data.email;

        this._profilePicUrl = result.data.picture;
    }

问题是,尽管名称、电子邮件和个人资料图片正在更新,但这些更改不可见。一旦其他任何东西触发角$应用,更改就会出现,但由于可观察到,控制器中的这些更改发生在由$超文本传输协议调用触发的角摘要循环之后。如果我的服务只是向控制器返回一个promise,这确实可以正常工作。

在这种情况下,如何更新视图?我不想手动连接每个可观察对象以触发摘要循环。我希望所有可观察对象在接收到新值或错误时触发摘要循环。

共有2个答案

杨昆
2023-03-14

我拿不到处方。ScopeScheduler方法无法工作,因此我只是重写了rx observable subscribe方法本身,并将回调封装在$rootScope中$适用:)

module.run(['$rootScope', 'rx', function ($rootScope, rx) {
    rx.Observable.prototype.subscribe = function (n, e, c) {
        if(typeof n === 'object') {
            return this._subscribe(n);
        }

        var onNext = function(){};
        if(n) {
            onNext = function(value) {
                if($rootScope.$$phase) {
                    n(value);
                }
                else {
                    $rootScope.$apply(function(){ n(value); });
                }
            };
        }

        var onError = function(err) { throw err; };
        if(e) {
            onError = function(error) {
                if($rootScope.$$phase) {
                    e(error);
                }
                else {
                    $rootScope.$apply(function(){ e(error); });
                }
            };
        }

        var onCompleted = function(){};
        if(c) {
            onCompleted = function() {
                if($rootScope.$$phase) {
                    c();
                }
                else {
                    $rootScope.$apply(function(){ c(); });
                }
            };
        }

        return this._subscribe(
            new rx.AnonymousObserver(onNext, onError, onCompleted)
        );
    };
}]);
桂坚
2023-03-14

我们可以使用rx的ScopeScheduler。有棱角的谢谢。我们只需创建一个新模块,在其中创建角度模块并将$rootScope传递给它:

const module : ng.IModule = angular.module( 'moduleName', [] );

module.run( ["$rootScope", ( $rootScope ) => {
    new Rx.ScopeScheduler( $rootScope );
}]);

这就是你要做的。现在全部接收。可观测值在获得新值时触发$apply。

由于某种原因,在接收时ScopeScheduler被删除。有棱角的js库已升级到rxjs版本4。我们必须使用rx。有棱角的js版本0.0。14使用ScopeScheduler。

我不知道版本4中建议的解决方案是什么。

可以在此处查看使用此修复html" target="_blank">程序的项目:

https://github.com/Roaders/Typescript-OAuth-SPA/tree/observable_apply_issues

 类似资料:
  • 当我单击一个按钮(刷新页面中的数据,释放缓存)主页时,我想刷新页面我的主页中有一个列表。有一个功能可以更改列表上的项目。但当我更改项目并重定向到主页时,它会显示以前的值,直到刷新页面为止,我只想在按下按钮时刷新(清除主页上的缓存)。控制器处于$状态。go(“应用程序订阅”) 我写了这个。如何更改它?

  • 问题内容: 我有一个具有单个 视图* 的 Eclipse插件 (例如eclipse helloworld-view-plugin- project)。在视图文件中 ,我想更新视图时 得到一个 事件 。 *** 在此视图中,我在一个具有多个标签的组中有一个GridData。我有几个 注册到程序的服务,其状态应 在此GridData中显示。 编辑:为了更好地显示我的问题,我更新了这篇文章,并添加了整个

  • 我有一个部分视图,我正在发送两个参数,然后尝试使用$(“#div”).html(结果)刷新部分视图div。使用mvc操作将数据正确地发送到partial view,并且我在控制台中看到partial view正在通过ajax调用进行更新。所有工作都按预期进行,但mainview中的部分视图从未得到更新或刷新。所以我总是第一次看到SubscriptionID和EntityOrganizationID

  • 似乎刷新问题之前讨论过,但没有一个解决方案对我有效。 我正在尝试做的事情:我正在使用FragmentStatePagerAdapter。适配器的每个位置都保存一个片段,该片段具有类似国际象棋的线性布局,每个单元格由CheckedTextView表示。 问题:即使正确存储和分配了值,视图仍然不能刷新,视图中单元格的值也不会得到更新。 我尝试过的建议都不起作用:1。调用Adapter.NotifyDa

  • 问题内容: 我正在使用swift构建RSS阅读器,并且需要实现pull来重新加载功能。 这是我试图做到的方式。 我正进入(状态 : super.init调用未初始化属性“ self.refresh” 请帮助我了解手势识别器的行为。一个有效的示例代码将有很大的帮助。 谢谢。 问题答案: 拉动刷新 是iOS内置的。你可以像这样迅速 在某些时候,您可能会刷新。

  • 问题内容: 我在这里阅读,但是如果xml文件更改,jtree不会重新加载/ refreshes 如何创建刷新/重新加载Jtree的函数, 我尝试编写代码: 但我收到错误:java.lang.NullPointerException 问题答案: 我添加了一个新的,以在。您可能需要从构造函数中重构出来;为了方便起见,我已经对其进行了硬编码: