Angular的$ scope在PayPal方法承诺中不起作用

时间:2016-12-22 16:34:04

标签: javascript angularjs paypal paypal-sandbox

在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)时,我可以看到对象就在那里。

2 个答案:

答案 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承诺。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的源时,这非常有用。

- AngularJS $q Service API Reference - $q.when

答案 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语句。