khashayar / ng-trim-value-accessor

Angular's (missing) trim accessor to automatically trim values of input fields
MIT License
53 stars 19 forks source link

TypeError: Class constructor DefaultValueAccessor cannot be invoked without 'new' #12

Closed eassymo closed 5 years ago

eassymo commented 6 years ago

Getting:

TypeError: Cannot read property 'setProperty' of undefined

when upgrading from Angular 4 to 5

using version 1.0.1

eassymo commented 6 years ago

Upgrading from 1.0.1 to 2.0.2 throws next error:

TypeError: Class constructor DefaultValueAccessor cannot be invoked without 'new'

khashayar commented 6 years ago

What exact version of Angular are you using? Can you provide a plunker?

dankahle commented 6 years ago

I'm thinking this DefaultValueAccessor was never meant to be extended. These host bindings only work on the subclass, i.e. they don't inherit, this is why you have bug #11. Because your (blur) handler overrides (in actuality it could never run as "only the subclasses host bindings will run") the parent classes (blur) host binding that points to OnTouched(). As I look at this, and try to hack a solution, the only thing that comes to mind is to just copy DefaultValueAccessor and hack that, i.e. don't inherit anything. It has implementation that it figures is important, but that's in private methods inaccessible from a subclass, so you can't just subclass it, steal its host bindings and override a couple methods (writeValue, _handleInput) to get what you want. I'm gonna try to write this from scratch using the DefaultValueAccessor as a template to start from. Probably the only way.

dankahle commented 6 years ago

ok, seems like this is working. I have to wrap it in tests, but I figure this is the way to go (copy and hack DefaultValueAccessor). I also added :not(input:[matAutoComplete], the only material accessor I know that it had been clashing with: you can only have one accessor per form control. In reality, no trim needed for autocomplete, so no big deal there. my accessor

FrancescoBorzi commented 5 years ago

hello there, this looks like a common issue among all libraries that extend DefaultValueAccessor. I opened a question here, so we can merge our forces to deal with this problem:

https://stackoverflow.com/questions/53371662/typeerror-class-constructor-defaultvalueaccessor-cannot-be-invoked-without-new

please feel free to contribute

timostamm commented 5 years ago

Having the same error message after updating my tsconfig.json (angular 6.10) from:

  "compilerOptions": {
    "target": "es5",

to:

  "compilerOptions": {
    "target": "es6",

With this change, I can reliably turn the bug on and off.

I guess that there is a side-effect of the transpilation that uncovers the bug.

For now, I have reverted to es5 - I was just checking out generator support.

My guess is that adding a constructor that calls the super constructor will fix the issue.

khashayar commented 5 years ago

Thanks for your detailed report. Please feel free to open a PR for the fix and I will be happy to merge it.