AngularJS中的循环依赖和OOP问题

我已经成功地将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;

}]);

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

然而

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

};

}]);

由于名称空间也可能是循环依赖的主题,因此上述修复方法将无效。这意味着它不是描述问题的解决方案,而是现在的一个更深层次的问题。

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

回答:

我之所以回答自己的问题,只是因为我找到了一种技术方法来解决最初发布的问题。但是在此之前,我强烈建议您使用Blackhole的建议,因为它可以解决通常由不良体系结构引起的更广泛的问题。请优先使用他的方法,如果您知道自己在做什么,请返回到当前方法。

因此,这里去:

您可以$injector在运行时使用服务并注入所需的定义,从技术角度来看,这是合法的,但是根据这篇文章(很难想象它是在2008年编写的),这就像一个黑魔法,它会反击你:

Application.factory('Blog', ['$injector', function ($injector) {

var Tag = $injector.get('Tag'); // Here is your tag

...

}]);

Application.factory('Tag', ['Blog', function (Blog) {

...

}]);

编辑

事实证明,当前方法是服务定位器模式的一个示例,即IoC反模式。

以上是 AngularJS中的循环依赖和OOP问题 的全部内容, 来源链接: utcz.com/qa/404203.html

回到顶部