Des problèmes avec la circulaire de la dépendance et de la programmation orientée objet en AngularJS

AngularJS + la programmation orientée objet est un peu sexy fonctionnalité à utiliser

Salut, je suis avec succès à l'aide de la programmation orientée objet avec AngularJs pour un certain temps déjà (d'abord commencé avec angularjs avec l'héritage de la programmation orientée objet en action), la démarche permet de définir vos classes angulaire de services, que vous pourrez ensuite prolonger ou d'hériter de ce genre:

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

en utilisant l'approche décrite, vous donne la possibilité de définir des classes qui magnifiquement intégrer dans angulaire de l'infrastructure. Vous obtenez toutes sortes de fonctionnalités intéressantes à partir de deux mondes - POO et AngularJs. L'injection de dépendance est gratuit pour vos classes, et il rend vos classes très simple, permet de mettre beaucoup de texte standard contrôleur de code dans certains de la classe de base qui peut ensuite être réutilisé.

Cependant

AngularJs infrastructure blocs précédemment décrit approche de déploie ses ailes sur tous les 100%. Le problème se produit lorsque vous essayez de définir récursive définitions de classe (c'est à dire récursive de l'agrégation), disons que vous avez deux définitions de classe comme Blog et 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;
}]);

Ça ne marchera pas parce que les deux Blog et Tag sont auto-référencement eux-mêmes, provoquant la dépendance circulaire.

P. S

La dernière chose, j'ai trouvé un peu laid solution qui résout mon problème, dans mon cas précis, mais ne fonctionne pas, en général, et comme je l'ai dit, il n'est pas assez:

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

Question

Le correctif ci-dessus ne fonctionnera pas parce que les espaces de noms peuvent aussi être un objet de dépendance circulaire. Cela signifie qu'il n'est pas la solution au problème décrit, mais plutôt un niveau plus profond problème maintenant.

Des suggestions sur la façon dont il est possible de résoudre ce problème décrit dans le cas général?

InformationsquelleAutor Lu4 | 2013-10-13