Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 无法完全访问条带回调中的$scope变量?_Angularjs_Stripe Payments - Fatal编程技术网

Angularjs 无法完全访问条带回调中的$scope变量?

Angularjs 无法完全访问条带回调中的$scope变量?,angularjs,stripe-payments,Angularjs,Stripe Payments,我在尝试将stripe集成到角度项目中时遇到了一些奇怪的问题。我正在控制器中运行stripe方法,我想从回调中更新各种作用域值。我相信有一些范围问题我不理解。我可以在回调中控制台记录我的作用域变量,更新它们并再次控制台记录以查看新值。但是,如果我尝试在回调之外再次记录变量,我会得到旧值,然后新值不会进入我的视图。我还尝试将$scope原语移动到$scope对象,但没有成功。这里有一个例子 app.controller('checkoutCtrl', function ($scope) {

我在尝试将stripe集成到角度项目中时遇到了一些奇怪的问题。我正在控制器中运行stripe方法,我想从回调中更新各种作用域值。我相信有一些范围问题我不理解。我可以在回调中控制台记录我的作用域变量,更新它们并再次控制台记录以查看新值。但是,如果我尝试在回调之外再次记录变量,我会得到旧值,然后新值不会进入我的视图。我还尝试将$scope原语移动到$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);

});