Коллега утверждает, что это неправильный способ внедрить чистый класс JavaScript ES6 в Angular. Мне любопытно, есть ли способ лучше (более правильный)?
Кроме того, лучше ли (и почему лучше) прикреплять внедряемые зависимости (в этом примере $timeout
) к экземпляру; например, this._$timeout = $timeout
в конструкторе. Я лично думаю, что в этом случае нет никакого преимущества в этом.
class.factory.js
let ClassFactory = function($timeout) {
// Factory function that simply returns class constructor.
class MyClass {
constructor(a, b) {
// contrived class
this.a = a;
this.b = b;
this.c = null;
}
applyChange() {
// contrived class method
const SELF = this;
$timeout(() => {
SELF.c = SELF.a + SELF.b;
});
}
}
return MyClass ;
};
ClassFactory.$inject = ['$timeout'];
export default ClassFactory;
app.module.js
import ClassFactory from './factories/class.factory';
import AppService from './services/app.service';
export default angular.module('myApp', [])
.factory('ClassFactory', ClassFactory)
.service('AppService', AppService);
Позже в другом месте мы можем использовать класс в какой-нибудь службе или контроллере для создания новых экземпляров MyClass.
app.service.js
class AppService {
// contrived usage of our dependency injected pure class.
constructor(ClassFactory) {
this.array = [];
this._ClassFactory = ClassFactory;
}
initialize(a, b) {
// We can instantiate as many "MyClass" objects as we need.
let myClass = new this._ClassFactory(a, b);
this.array.push(myClass);
}
static serviceFactory(...injected) {
AppService.instance = new AppService(...injected);
return AppService.instance;
}
}
AppService.serviceFactory.$inject = ['ClassFactory'];
export default AppService.serviceFactory;