同僚は、純粋なES6 JavaScriptクラスをAngularに注入する方法が間違っていると主張しています。より良い方法があれば好奇心旺盛です(より正確です)?純粋なクラスをES6の角度1.xアプリケーションに注入する正しい方法
これに加えて、注入された依存関係(この例では$timeout
)をインスタンスに添付する方が良い(それがなぜ良いか)。例えば、this._$timeout = $timeout
をコンストラクタ内に挿入する。私は個人的にこの場合、それをすることに利点がないと思っています。
class.factory.js
import ClassFactory from './factories/class.factory';
import AppService from './services/app.service';
export default angular.module('myApp', [])
.factory('ClassFactory', ClassFactory)
.service('AppService', AppService);
その後
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、他の場所で、私たちは新しい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;
AppService.instance =新しいAppServiceのような処理もお勧めできません。アプリケーションインスタンスが1つしかなく、サービスがシングルトンであるため、通常は正常に動作します。しかし、テスト中にメモリリークが発生します。 – estus