AngularJS + OOP はちょっとセクシーな機能です
こんにちは、私は既にしばらくの間 AngularJs で OOP をうまく使用しています (最初は oop 継承が動作している angularjsから始めました)。提供されたアプローチにより、クラスを angular サービスとして定義でき、後でそのように拡張または継承できます。
Application.factory('AbstractObject', [function () {
var AbstractObject = Class.extend({
virtualMethod: function() {
alert("Hello world");
},
abstractMethod: function() { // You may omit abstract definitions, but they make your interface more readable
throw new Error("Pure abstract call");
}
});
return AbstractObject; // You return class definition instead of it's instance
}]);
Application.factory('DerivedObject', ['AbstractObject', function (AbstractObject) {
var DerivedObject = AbstractObject.extend({
virtualMethod: function() { // Shows two alerts: `Hey!` and `Hello world`
alert("Hey!");
this._super();
},
abstractMethod: function() {
alert("Now I'm not abstract");
}
});
return DerivedObject;
}]);
プランカー: http://plnkr.co/edit/rAtVGAsNYggBhNADMeoT
説明したアプローチを使用すると、Angular インフラストラクチャに美しく統合するクラスを定義できます。OOP と AngularJs という 2 つの世界からあらゆる種類の気の利いた機能を利用できます。依存性注入はクラスに対して無料であり、クラスをシンプルにし、後で再利用できる基本クラスに多くのボイラープレート コントローラー コードを配置できます。
でも
AngularJs インフラストラクチャは、前述のアプローチをすべて 100% に広げることをブロックします。この問題は、再帰的なクラス定義 (つまり、再帰的な集約) を定義しようとすると発生します。たとえば、 と のような 2 つのクラス定義があるBlog
とします。Tag
Application.factory('Blog', ['Tag', function (Tag) {
var Blog = Class.extend({
tags: function() {
return this.tags;
}
});
return Blog;
}]);
Application.factory('Tag', ['Blog', function (Blog) {
var Tag = Class.extend({
Blogs: function() {
return this.blogs;
}
});
return Tag;
}]);
Blog
との両方Tag
が自己参照しているため、循環依存関係が発生しているため、機能しません。
PS
最後に、特定のケースで私の問題を解決するちょっとい解決策を見つけましたが、一般的には機能しません。私が言ったように、それはきれいではありません:
Application.factory('BlogNamespace', [function () {
var Blog = Class.extend({
tags: function() {
return this.tags;
}
});
var Tag = Class.extend({
Blogs: function() {
return this.blogs;
}
});
return {
Tag: Tag,
Blog: Blog
};
}]);
質問
名前空間も循環依存の対象になる可能性があるため、上記の修正は機能しません。これは、説明されている問題の解決策ではなく、1 レベル深い問題であることを意味します。
一般的なケースで説明されている問題を解決する方法について何か提案はありますか?