Open johnnncodes opened 9 years ago
+1
+1
Is this issue solved ?
No—the code as written handles the narrow case of the handler being directly published as a property on the scope. If you wanted to fix this, fork + change scope[attr...
to:
$parse(attr.stripeForm)(scope).apply(scope, args)
However, the general implementation is already an anti-pattern and fixing this particular line doesn't change that. Using your template to pass up a callback is the biggest issue. You'll notice that directives that react to actions like ngSubmit
typically take an expression that calls a function to evaluate itself, not an expression to evaluate that returns a function to be called from elsewhere:
<form ng-submit="create(user)"></form>
The reason the pattern of returning a function and then calling it internally is so problematic is that it very tightly couples you to the expectation that you don't have to do anything before getting the token. What if you decide you want to call a postal code lookup service so you only collect the postal code from the user but send the full address to Stripe? You're out of luck. You have to dig up all the stripe-form
attributes and totally rewrite your form handling. That sort of logic belongs in code (in a controller), not tightly coupled to your templates.
Check out https://github.com/bendrucker/angular-stripe for a more flexible Stripe service, https://github.com/bendrucker/angular-credit-cards for validation and parsing, and https://github.com/bendrucker/angular-form-state for managing the submission state of any form (e.g. disabling the submit button during submission).
:+1:
Yes!
Dont forget, if you're lazy:
ControllerAs is just syntactic sugar and you can still inject $scope into your controllers and use this / any plugin as normal. with $scope and reserve your controlleras syntax for everything else you're doing.
any idea how to fix this?
I'm getting this error when I submit the form:
TypeError: Cannot read property 'apply' of undefined
scope[attr.stripeForm].apply(scope, args);