在PayPal承诺中,我的$scope
似乎已被打破:
onAuthorize: function(data, actions) {
paypal.request.post(execute_payment_url)
.then(function(data) {
$rootScope.loader = true; // no response?!
if (data.payment.state === 'approved') {
alert('hey!') // worked
$location.path('/signup/').search({ // no response
email: data.payment.payer.payer_info.email
});
}
})
.catch(function(err) {
alert('error')
}).finally(function() {
$rootScope.loader = false;
})
}
我不知道为什么,$rootscope
和$location
已经注入我的控制器。当我拨打console.log($location)
时,我可以看到对象就在那里。
答案 0 :(得分:2)
这种情况正在发生,因为PayPal承诺不是AngularJS $q
服务承诺。 $q
服务承诺与AngularJS框架摘要周期集成在一起。可以使用$q
将其带入$q.when
服务承诺事件队列。
onAuthorize: function(data, actions) {
//paypal.request.post(execute_payment_url)
$q.when(paypal.request.post(execute_payment_url))
.then(function(data) {
$rootScope.loader = true; // no response?!
if (data.payment.state === 'approved') {
alert('hey!') // worked
$location.path('/signup/').search({ // no response
email: data.payment.payer.payer_info.email
});
}
})
.catch(function(err) {
alert('error')
}).finally(function() {
$rootScope.loader = false;
})
}
$ q.when
将可能是值的对象或(第三方)包装成$ q承诺。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的源时,这非常有用。
答案 1 :(得分:1)
问题可能是您使用paypal库而不是angular $ http服务来发出请求。因此,angular不知道它需要更新数据。为了强制它,您可以手动应用更改:
onAuthorize: function(data, actions) {
paypal.request.post(execute_payment_url)
.then(function(data) {
$rootScope.$apply(function() {
$rootScope.loader = true; // no response?!
if (data.payment.state === 'approved') {
alert('hey!') // worked
$location.path('/signup/').search({ // no response
email: data.payment.payer.payer_info.email
});
}
});
})
.catch(function(err) {
alert('error')
}).finally(function() {
$rootScope.$apply(function() { $rootScope.loader = false; });
})
}
[[更新]] 在success / finally回调中移动了$ apply语句。