gpt4 book ai didi

angularjs - Angular Stripe - 将 Stripe 支付表单转换为 Stripe 元素

转载 作者:行者123 更新时间:2023-12-04 15:08:07 25 4
gpt4 key购买 nike

我曾经有 Angular Stripe Checkout 表单,我正在尝试将表单更新为新的 Stripe Card Elements这是最近推出的。

删除表单输入字段并将其替换为条纹卡片元素后,我的表单如下所示:

<form name="payment" ng-submit="vm.submit()">
<div class="row">
<label for="card-element">
Credit or debit card
</label>
<div id="card-element">
<!-- a Stripe Element will be inserted here. -->
</div>
</div>
<button class="btn btn-primary" type="submit" ng-disabled="vm.submitting">Pay!</button>
<div ng-show="vm.cardError" class="row">
<div class="has-error">
<p class="help-block">* {{vm.cardError}}</p>
</div>
</div>
</form>

以前在 Angular 中,提交表单时,我正在处理 submit()stripeResponseHandler从 Controller 。使用新更改更新我的 Angular Controller 后,我的 Controller 现在看起来像这样:
function PaymentController() {
var vm = this;
var elements = stripe.elements();
var style = {
base: {
color: '#32325d',
lineHeight: '24px',
fontFamily: 'Helvetica Neue',
fontSmoothing: 'antialiased',
fontSize: '16px',
'::placeholder': {
color: '#aab7c4'
}
},
invalid: {
color: '#fa755a',
iconColor: '#fa755a'
}
};
vm.card = elements.create('card', {style: style});
vm.card.mount('#card-element');

// Handle real-time validation errors from the card Element.
vm.card.addEventListener('change', function(event) {
if (event.error) {
vm.cardError = event.error.message;
} else {
vm.cardError = '';
}
});

function submit() {
vm.cardError = '';
vm.submitting = true;
createToken();
}

// Send data directly to stripe
function createToken() {
stripe.createToken(vm.card).then(function(result) {
if (result.error) {
vm.cardError = result.error.message;
vm.submitting = false;
} else {
// Send the token to your server
stripeTokenHandler(result.token);
}
});
}

// Response Handler callback to handle the response from Stripe server
function stripeTokenHandler(token) {
vm.tokenData = {
token: token.id
};
.. Process the rest in server ...
}
}

上面的代码按原样工作。但我对这些感到困惑:

1) 由于 Stripe 现在使用 DOM 操作在表单中插入卡片元素,这是否使我的上述方法与 Angular 方式一样错误?意思是,我不应该再在 Controller 中执行这些操作,而是将它们移到指令中吗?或者这不是必要的,因为操作的元素正在使用 stripe.elements() .

2)如果我确实需要将它们包含在指令中,我只是不确定如何将上述转换为 Angular 指令。它首先通过挂载来操作元素(可以添加到指令链接函数中),但后来它继续使用 card表单提交和事件处理程序的元素。我是否需要在指令链接本身内部执行所有这些操作,以便在指令 Controller 内部提交提交和链接中的元素操作?

我很困惑,并坚持在这里做什么。如果我做错了,有人可以给我一个关于如何解决这个问题的样本吗?

我正在使用 Angular 1.5。

最佳答案

我现在已将 Controller 更改为指令,并将所有 jquery 和 angular 代码放在 Link 函数中。这是我的指令代码在更新后的样子:

function stripeForm() {

// Link Function
function link(scope, element, attrs) {

scope.submitCard = submitCard;

var elements = stripe.elements();
var style = {
iconStyle: 'solid',
style: {
base: {
iconColor: '#8898AA',
color: '#000',
lineHeight: '36px',
fontWeight: 300,
fontFamily: 'Helvetica Neue',
fontSize: '19px',

'::placeholder': {
color: '#8898AA',
},
},
invalid: {
iconColor: '#e85746',
color: '#e85746',
}
},
classes: {
focus: 'is-focused',
empty: 'is-empty',
},
};
var card = elements.create('card', style);
card.mount('#card-element');

// Handle real-time validation errors from the card Element.
card.on('change', function(event) {
setOutcome(event);
});

// Form Submit Button Click
function submitCard() {
var errorElement = document.querySelector('.error');
errorElement.classList.remove('visible');
createToken();
}

// Send data directly to stripe server to create a token (uses stripe.js)
function createToken() {
stripe.createToken(card).then(setOutcome);
}

// Common SetOutcome Function
function setOutcome(result) {
var errorElement = document.querySelector('.error');
errorElement.classList.remove('visible');
if (result.token) {
// Use the token to create a charge or a customer
stripeTokenHandler(result.token);
} else if (result.error) {
errorElement.textContent = result.error.message;
errorElement.classList.add('visible');
}
}

// Response Handler callback to handle the response from Stripe server
function stripeTokenHandler(token) {
..send to server ...
}
}

// DIRECTIVE
return {
restrict: 'A',
replace: true,
templateUrl: 'payment/PaymentForm.html'
link: link
}
}

我的 HTML 文件现在是这样的:
<form ng-submit="submitCard()">
<div>
<label>
<div id="card-element" class="field"></div>
</label>
</div>
<div>
<button class="btn btn-primary pull-right" type="submit">Pay!</button>
<button class="btn btn-danger pull-left" type="button" ng-click="cancel()">Cancel</button>
</div>
<div>
<div class="error"></div>
</div>
</form>

关于angularjs - Angular Stripe - 将 Stripe 支付表单转换为 Stripe 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42361664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com