在特定情况下,我需要调用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()
,它将使视图更新有效,但是我认为这是不正确的方法。
有解决方案吗?
答案 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
)