angular-payments icon indicating copy to clipboard operation
angular-payments copied to clipboard

Doesn't work when using controllerAs syntax

Open johnnncodes opened this issue 9 years ago • 8 comments

I'm getting this error when I submit the form:

TypeError: Cannot read property 'apply' of undefined

scope[attr.stripeForm].apply(scope, args);

 <form stripe-form="myCtrl.handleStripe" name="myCtrl.myForm">

johnnncodes avatar Dec 23 '14 14:12 johnnncodes

+1

guilhemSoulas avatar Dec 30 '14 15:12 guilhemSoulas

+1

sebastiannm avatar Jan 09 '15 11:01 sebastiannm

Is this issue solved ?

rahil471 avatar Mar 31 '15 11:03 rahil471

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).

bendrucker avatar Mar 31 '15 11:03 bendrucker

:+1:

ESimmonds avatar Aug 04 '15 15:08 ESimmonds

Yes!

salehrastani avatar Aug 05 '15 19:08 salehrastani

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.

LunarDevelopment avatar Aug 24 '15 13:08 LunarDevelopment

any idea how to fix this?

sabareeshkk avatar Jul 05 '16 07:07 sabareeshkk