我正在使用angularJS,我这样做:
xxx.then(function (response) {
$scope.x = response.x;
$scope.y = response.y;
}, function (error) {}
);
响应来自服务器不是即时的。然后当响应来的时候,我希望比范围更新我的值,但是只有当我点击其他按钮时才这样做。
在我的html中,我收到了这样的信息:
<p>{{x}}</p>
<p>{{y}}</p>
你知道我做错了吗?
答案 0 :(得分:1)
这可能是摘要周期的问题,请尝试执行以下$scope.$apply()
:
xxx.then(function (response) {
$scope.x = response.x;
$scope.y = response.y;
$scope.$apply();
}, function (error) {});
在AngularJS中,传播了承诺解析的结果 异步,在$ digest周期内。所以,回调注册了 只有在进入$ digest循环时才会调用then()。
您的承诺的结果将不会传播到下一个摘要周期。由于您的代码中没有任何其他内容可以触发摘要周期,因此不会立即应用更改。但是,当您单击某个按钮时,它会触发摘要周期,由此会应用更改
检查this以获得有关此问题的明确说明。
答案 1 :(得分:0)
如果承诺来自$ q服务以外的来源,则.then
方法可能无法更新DOM。使用$q.when
将外部承诺转换为$ q服务承诺:
//xxx.then(function (response) {
$q.when(xxx).then(function (data) {
$scope.x = data.x;
$scope.y = data.y;
}, function (error) {
throw error;
});
$ q服务与AngularJS框架集成,$ q服务.then
方法将自动调用框架摘要周期来更新DOM。
$ q.when
将可能是值的对象或(第三方)随后的承诺包含到
$q
承诺中。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的源时,这非常有用。