The default blueprint for ember-cli addons.
npm install ember-legacy-class-transform
This transform has been deprecated in favor of the ember-legacy-class-shim,
which is overall a better solution to legacy class support in Ember.
This addon adds a transform for using ES Classes with legacy versions of Ember (< 2.13.0).
It transforms the class's constructor function into init, which allows both theconstructor and class fields to work.
The reason legacy versions of Ember need this transform lies, at its core, in the
double extend
which was used for the longest time to inject services and other things. This double
extend ends up creating a new class altogether which, due to the way classes are handled
internally in Ember, _never_ calls super.
This means that when we define a class using class it's constructor never gets run.
A side-effect of this is that class fields, which are assigned _in_ the constructor, do
not get assigned. This substantially reduces the usefulness of class syntax and decorators
since they rely substantially on class fields working as expected.
When combined with the class fields transform, this takes classes defined like so:
``js
class Foo {
bar = 'baz';
constructor() {
// do something
}
}
`
And transforms them into this:
`js
class Foo {
constructor() {
if (!this.__didInit) {
this.init();
}
}
init() {
// do something
this.bar = 'baz';
this.__didInit = true;
}
}
`
It actually _does_ work when you make objects/classes outside of the standard Ember
container lifecycle, so just doing Foo.create() for instance. The logic in placeinit
ensures that only gets called once in all cases.
init is very similar to constructor, it gets called in the same context at meaning it gets to do any setup it
_almost_ the same time. The key difference is that when using classes normally,
the subclass's constructor gets called first
wants before calling super. init, on the other hand, only gets called after
most of the setup has been done (if extending from Ember.Object).
Ultimately, the code flow _before_ calling super in constructor will differ
between legacy versions and modern versions of Ember. To avoid this, simply callsuper as the very first thing in any classes which extend Ember.Object.
``js
class Foo extends Ember.Object {
constructor(...args) {
super(...args);
// do some things
}
}
`
* git clone this repositorycd ember-legacy-class-transform
* npm install
*
* ember serve
* Visit your app at http://localhost:4200.
* npm test (Runs ember try:each to test your addon against multiple Ember versions)ember test
* ember test --server
*
* ember build`
For more information on using ember-cli, visit https://ember-cli.com/.