Angularjs 无法完全访问条带回调中的$scope变量?
我在尝试将stripe集成到角度项目中时遇到了一些奇怪的问题。我正在控制器中运行stripe方法,我想从回调中更新各种作用域值。我相信有一些范围问题我不理解。我可以在回调中控制台记录我的作用域变量,更新它们并再次控制台记录以查看新值。但是,如果我尝试在回调之外再次记录变量,我会得到旧值,然后新值不会进入我的视图。我还尝试将$scope原语移动到$scope对象,但没有成功。这里有一个例子Angularjs 无法完全访问条带回调中的$scope变量?,angularjs,stripe-payments,Angularjs,Stripe Payments,我在尝试将stripe集成到角度项目中时遇到了一些奇怪的问题。我正在控制器中运行stripe方法,我想从回调中更新各种作用域值。我相信有一些范围问题我不理解。我可以在回调中控制台记录我的作用域变量,更新它们并再次控制台记录以查看新值。但是,如果我尝试在回调之外再次记录变量,我会得到旧值,然后新值不会进入我的视图。我还尝试将$scope原语移动到$scope对象,但没有成功。这里有一个例子 app.controller('checkoutCtrl', function ($scope) {
app.controller('checkoutCtrl', function ($scope) {
// default values
$scope.receipt = {};
$scope.paymentSuccess = false;
$scope.saveCardForFuture = true;
Stripe.card.createToken($scope.card, function (status, res) {
$scope.receipt = res.data;
$scope.paymentSuccess = true;
if ($scope.saveCardForFuture === true) {
// save card token
}
// tests cases
console.log($scope.saveCard) //logs undefined
console.log($scope.receipt) //logs the response data
console.log($scope.paymentSuccess) //logs true
});
// timeout long enough to wait for stripe response
$timeout(function() {
console.log($scope.receipt); //logs {}
console.log($scope.paymentSuccess) //logs false
}, 1000);
});
注意:条带不是作为控制器依赖项传递的,我只是从html索引页全局包含它。我还没有找到将其作为可注入依赖项的方法,但肯定有更好的方法。您将angularjs世界留在了条带回调中。用$scope.$apply(fn)附上回拨块 一些好的读物:
由于回调在Angular的生命周期之外运行,请首先添加一个
$scope.$apply()
,以使更改对Angular可见。我不知道Stripe是如何工作的,因此我无法帮助任何人。就依赖项注入而言,您可以将Stripe
全局对象作为值添加到IOC(angular.module('myApp')。value('Stripe',Stripe);
)中,然后通过依赖项注入请求它。这使您可以选择为测试提供一个模拟条带
对象,并用注释控制器代码“使用严格”代码>。这并不意味着条带
不再是一个全局对象。谢谢你,这已经奏效,$scope.$apply肯定是我很高兴知道的事情。你链接的那篇文章很棒。谢谢你,这篇文章非常有用
app.controller('checkoutCtrl', function ($scope) {
// default values
$scope.receipt = {};
$scope.paymentSuccess = false;
$scope.saveCardForFuture = true;
Stripe.card.createToken($scope.card, function (status, res) {
$scope.$apply(function () {
$scope.receipt = res.data;
$scope.paymentSuccess = true;
if ($scope.saveCardForFuture === true) {
// save card token
}
// tests cases
console.log($scope.saveCard) //logs undefined
console.log($scope.receipt) //logs the response data
console.log($scope.paymentSuccess) //logs true
});
});
// timeout long enough to wait for stripe response
$timeout(function() {
console.log($scope.receipt); //logs {}
console.log($scope.paymentSuccess) //logs false
}, 1000);
});