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 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. Вы получаете всевозможные отличные функции из двух миров - ООП и 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 сами ссылаются на себя, вызывая круговую зависимость.
P.S
Последнее, что я нашел своеобразное уродливое решение, которое решает мою проблему в моем конкретном случае, но не работает вообще, и, как я уже сказал, это некрасиво:
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
    };
}]);
Вопрос
Вышеупомянутое исправление не будет работать, поскольку пространства имен также могут быть предметом круговой зависимости. Это означает, что это не решение описанной проблемы, а проблема на уровне ниже уровня.
Любые предложения о том, как можно решить описанную проблему в общем случае?