AngularJS + OOP 使用起来有点性感
嗨,我已经成功地将 OOP 与 AngularJs 一起使用了一段时间(首先从 angularjs 开始,并在操作中使用 oop 继承),所提供的方法允许您将类定义为角度服务,您以后可以像这样扩展或继承它:
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;
}]);
Plunker:http ://plnkr.co/edit/rAtVGAsNYggBhNADMeoT
使用所描述的方法使您能够定义完美地集成到 Angular 基础架构中的类。你可以从两个世界——OOP 和 AngularJs 中获得各种漂亮的特性。依赖注入对您的类是免费的,它使您的类变得简单,允许将大量样板控制器代码放入一些以后可以重用的基类中。
然而
AngularJs 基础设施阻止了先前描述的方法,使其无法 100% 地展开它的翅膀。当您尝试定义递归类定义(即递归聚合)时会出现问题,假设您有两个类定义,例如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
自我引用自己导致循环依赖。
附言
最后一件事,我找到了一种丑陋的解决方案,可以在我的特定情况下解决我的问题,但通常不起作用,正如我所说,它并不漂亮:
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
};
}]);
问题
上述修复不起作用,因为命名空间也可能是循环依赖的主题。这意味着它不是描述问题的解决方案,而是现在更深层次的问题。
在一般情况下如何解决所描述的问题有什么建议吗?