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