【发布时间】:2013-10-21 01:44:59
【问题描述】:
AngularJS + OOP 使用起来有点性感
您好,我已经成功使用 AngularJs 的 OOP 有一段时间了(首先从 angularjs with oop inheritance in action 开始),提供的方法允许您将您的类定义为 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
};
}]);
问题
上述修复不起作用,因为命名空间也可能是循环依赖的主题。这意味着它不是描述问题的解决方案,而是现在更深层次的问题。
关于如何在一般情况下解决所描述的问题有什么建议吗?
【问题讨论】:
标签: javascript oop angularjs