Задать вопрос

Как правильно разрешить циклические ссылки модулей в dojo?

На сайте dojo есть статья про цилические ссылки. В ней говорится, что циклические ссылки в модулях разрешаются путем введения специального идентификатора модуля "exports". Когда модуль инстанцируется, мы в соответствующей переменной exports в фабрике модуля получаем ссылку на пока пустой объект, который далее будет использоваться как значение модуля. И все свойства и методы модуля мы устанавливаем в этот пустой объект exports, а не создаем новый и возвращаем его. С этим все понятно. До тех пор пока у нас значением модуля является синглетон-объект.
А как быть в случае, когда в качестве значения модуля выступает конструктор класса?
К примеру у нас есть следующие модули, которые возвращают конструкторы, а не синглетон-объекты:
// in "my/moduleA.js"
define([ "dojo/_base/declare", "./moduleB" ], function(declare, ModuleB){
    return declare("A", null, {
        consctructor: function(){
            // dependency on ModuleB
            this.moduleB = new ModuleB();
        }
        getValue: function(){
            return "oranges";
        },

        print: function(){
            log(this.moduleB.getValue());
        }
    });
});

// in "my/moduleB.js"
define([ "dojo/_base/declare", "./moduleA" ], function(declare, ModuleA){
    return declare("B", null, {
        constructor: function(){
            // dependency on ModuleA
            this.moduleA = new ModuleA();
        }
        getValue: function(){
            return "apples and " + this.moduleA.getValue();
        }
    });
});

// in "index.html"
require([
    "my/moduleA"
], function(ModuleA) {
    var moduleA = new ModuleA();
    moduleA.print();
});


Если бы не было циклических ссылок, то все было бы нормально. Когда появляется циклическая ссылка, мы должны в модуль moduleA добавить exports, и настраивать именно его как значение модуля. Но нам ведь в качестве значения модуля нужен конструктор объектов, а не синглетон-объект, каким будет являться exports. Вот именно в этом и заключается моя проблема. Подскажите, есть ли решение и какое?
Сейчас я сделал следующим образом:
// in "my/moduleA.js"
define([ "dojo/_base/declare", "./moduleB", "exports" ], function(declare, ModuleB, exports){
    var A = declare("A", null, {
        consctructor: function(){
            // dependency on ModuleB
            this.moduleB = new ModuleB();
        }
        getValue: function(){
            return "oranges";
        },

        print: function(){
            log(this.moduleB.getValue());
        }
    });

    exports.newInstance = function() {
        return new A();
    }
});

// in "index.html"
require([
    "my/moduleA"
], function(ModuleA) {
    //тут ModuleA является фабрикой объектов, а не конструктором 
    var moduleA = ModuleA.newInstance();
    moduleA.print();
});

т.е. модуль A возвращает мне не конструктор A, а синглетон-объект, который является фабрикой объектов A. Такой подход работает, и, в принципе, я могу оставить и его. Но хотелось бы узнать, если способ вернуть в качестве значения такого модуля конструктор объектов?
  • Вопрос задан
  • 2147 просмотров
Подписаться 2 Оценить 6 комментариев
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
если модуль А зависит от модуля B и модуль B зависит от модуля A то мы можем:

1) лениво загружать зависимости через require в одном из модулей уже после инициализации (кастыль)
2) вынести часть функциональности от которой зависит один из модулей в третий модуль C, и таким образом мы устраним циклическую зависимость.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы