AngularJS + OOP 是一种使用起来很性感的特性
嗨,我已经成功地将 OOP 与 AngularJs 一起使用了一段时间(首先从angularjs开始, 在操作中使用 oop 继承),提供的方法允许您将类定义为 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;
}]);
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
};
}]);
问题
上述修复将不起作用,因为命名空间也可能是循环依赖的主题。这意味着它不是所描述问题的解决方案,而是现在更深一层的问题。
关于如何在一般情况下解决所描述的问题的任何建议?