Braintree javascript 客户端 - 拆解调用不会删除现有集成 - 我的托管字段出现错误

Braintree javascript client - Teardown call does not remove the existing integration - gettings error on my hosted fields

我目前正在尝试将 braintree 集成到我的 angularJS 网络应用程序中,但我遇到了以下问题。

当用户选择执行付款时,我会打开一个模式来显示我的付款表格。在模态的控制器中,我 运行 在 braintree.setup(...) 函数的开头。我在表单中使用托管字段。一切正常(提交测试卡号并成功取回随机数),但是当我关闭模式然后重新打开它时,我使用的托管字段出现以下错误:

Object {message: "Cannot place two elements in "#card-number""}
Object {message: "Cannot place two elements in "#cvv""}
Object {message: "Cannot place two elements in "#expiration-month""}
Object {message: "Cannot place two elements in "#expiration-year""}

我尝试使用提供的拆卸方法(如文档中所示),但仍然不断收到该错误。

在 modal 的控制器中,当我从服务器获得令牌时调用函数 $scope.setupBraintree($scope.token)$scope.setupBraintree 定义如下:

$scope.setupBraintree = function(token){

    braintree.setup(token, "custom", {
        id: "paymentForm",
        hostedFields: {
            number: {
                selector: "#card-number"
            },
            cvv: {
                selector: "#cvv"
            },
            expirationMonth: {
                selector: "#expiration-month"
            },
            expirationYear: {
                selector: "#expiration-year"
            }
        },
        onReady: function(integration){
            $scope.checkout = integration;
        }
    });
};

然后,当用户关闭模式时,$scope.cancel() 被调用,其定义如下:

$scope.cancel = function() {

    $scope.checkout.teardown(function () {
                 $scope.checkout = null;
                // braintree.setup can safely be run again!
    });

    $uibModalInstance.dismiss('cancel');
};

所以当我想要销毁 braintree 集成时(当模态关闭时),我调用了 teardown 方法。当我关闭模态时,$scope.checkout 确实为空(这意味着如预期的那样拆卸 运行),但是当我再次打开模态时(我再次向服务器执行新请求以获取一个客户端令牌)我收到了关于托管字段的上述错误,所以我想知道我是否遗漏了一些东西,或者托管字段的拆卸是否有任何问题。

感谢您的帮助, 巴比斯

拆机方法一切正常。问题是模态上注册的事件被触发了两次,因此设置是 运行 模态第二次打开时的两次。

修复了这个问题并按预期进行了拆卸,每次加载模态时设置功能都会顺利运行