AngularJS:嵌套的http调用不会更新视图

时间:2018-08-27 03:58:17

标签: angularjs typescript

在特定情况下,我需要调用github api来检索特定用户的信息。然后发出第二次调用以检索用户的存储库:

search(login: string): void {
       this.user = undefined; 
       // first call               
       this.githubApi.getUser(login)
            .then(user => {
                this.user = user;
                // second call
                this.githubApi.getRepos(user.repos_url)
                    .then(reposResponse => {
                        this.repos = reposResponse.repos;
                        // I don't like to call this.$scope.$apply() !!;
                    });
            });
    }

第一个调用被执行,并且this.user的绑定元素被更新,视图中没有问题。 执行第二个调用,并成功返回结果,并且正确设置了this.repos。但是,视图上的绑定元素不会更新。

如果我在第二个回调的最后一行调用this.$scope.$apply(),它将使视图更新有效,但是我认为这是不正确的方法。

有解决方案吗?

2 个答案:

答案 0 :(得分:0)

首先,您需要知道为何Angular-Js不更新视图。

您已使用$scope.$apply(),所以我假设您已经知道,它是如何工作的以及我们为什么使用它。现在,解决问题!

有时您进行回调-特别是nested callback-Angular不会更新视图。有时,angular认为由于回调而无需更新视图。并且当观察者的变量的值发生更改时,观察者不会采取任何措施。

然后,您使用$scope.$apply()重新运行摘要循环(假设您已经知道摘要循环,如果您不知道,则让我知道)。它使观察者可以更新视图。在您的情况下,摘要循环未运行,这就是为什么angular不更新视图的原因。如果您的摘要循环正在运行,angular会给您错误。因此,由于双向绑定不能正常工作,它将告诉angular重新运行摘要循环。

我认为没有其他方法。但是,如果有办法,我很想知道。也是不错的方法。正是出于这类问题。

答案 1 :(得分:0)

好吧,如果您不愿意使用$scope.apply();,请尝试使用以下方法更新getRepos服务响应代码:

setTimeout(
 () => {
  this.repos = reposResponse.repos;
 }, 0
)