私は、Angular 1.x を使用して Web アプリ アーキテクチャに取り組んでいます。新しいコンポーネントを定義するのはかなり簡単です:
class CustomComponent {
constructor(dep1, dep2, dep3) {
this.deps = { dep1, dep2, dep3 };
/* app code */
}
/* link, compile, instance methods, template generators... */
@readonly static $inject = ['dep1', 'dep2', 'dep3'];
}
私がやりたいのは、インジェクションの問題を除外することです。つまり、毎回記述this.deps
してコーディングするのではなく、ES7 のデコレータのようなものを使用して自動生成したいと考えています。static $inject
コードは次のようになります。
@injectionFromCtorComponents
class MyClass {
constructor (dep1, dep2, dep3) {
/* app logic */
}
}
これで、醜いですが、静的部分は実行可能です。
const angularInjectAnnotationFromCtor = (target) => {
let regexStr = `^function ${target.name}\\\((.*)\\\)[.\\s\\S]*}$`;
let regex = new RegExp(regexStr, 'gm');
let ctorArgsStr = target.prototype.constructor.toString().replace(regex, '\$1');
let ctorArgs = ctorArgsStr.replace(/ /g, '').split(',');
target.$inject = ctorArgs;
};
ただし、コンストラクターの依存関係をインスタンスに保存することは、はるかにトリッキーです。せいぜい薄っぺらですが、私は次のことを思いつきました:
const readonly = (target, key, descriptor) => Object.assign(descriptor, { writable: false });
class AngularComponent {
constructor () {
let ctorArgs = [...arguments];
let argNames = ctorArgs.pop();
// let's leave comprehensions out of this :)
this.deps =
argNames.reduce((result, arg, idx) => Object.assign(result, ({ [arg]: ctorArgs[idx] })), {});
}
}
@angularInjectAnnotationFromCtor
class MyClass extends AngularComponent {
constructor (one, two, three) {
super(one, two, three, MyClass.$inject);
}
}
ええ、これは私たちが始めた場所よりも悪いです...
それでは、質問は、これに対するより合理的な解決策を提案できる人はいますか?.. それとも、単に座って、今後数年以内にいつでも Chrome のプロキシを期待する必要がありますか?