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;
}]);

柱塞:http://plnkr.co/edit/rAtVGAsNYggBhNADMeoT

使用所描述的方法使您能够定义完美地集成到 Angular 基础架构中的类。您可以从两个世界(OOP和AngularJs)中获得各种漂亮的功能。依赖注入(inject)对于您的类是免费的,它使您的类变得简单,允许将许多样板 Controller 代码放入某些基类中,以便以后重用。

然而

AngularJs的基础架构阻止了前面描述的方法,无法将其翅膀扩展到所有100%。当您尝试定义递归类定义(即递归聚合)时,会出现问题,例如您有两个类定义,例如BlogTag
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;
}]);

这是行不通的,因为BlogTag都自引用,导致循环依赖。

压力

最后一件事,我发现了一种难看的解决方案,可以解决我的特定情况下的问题,但通常无法正常工作,而且正如我所说,它也不是很漂亮:
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
    };
}]);



上面的修复程序将不起作用,因为 namespace 也可能是循环依赖的主题。这意味着它不是描述问题的解决方案,而是现在的一个更深层次的问题。

关于在一般情况下如何解决所描述问题的任何建议?

最佳答案

循环依赖始终是混合关注点的标志,这确实是一件坏事。 AngularJS的作者之一MiškoHevery解释了一个不错的解决方案on his awesome blog。简而言之,您可能在某处隐藏了第三项服务,这是另外两项真正需要的代码的唯一部分。

07-24 09:49
查看更多