2015-01-28 25 views
0

Я пытался установить RequireJS для обработки круговых зависимостей с использованием the special 'exports' magic module, как рекомендовано James Burke's answer, до this question.RequireJS, круговые зависимости и экспорт «Волшебный» метод

После примере, приведенном @jrburke в этом вопросе:

define("Employee", ["exports", "Company"], function(Company) { 
    function Employee(name) { 
     this.name = name; 
     this.company = new Company.Company(name + "'s own company"); 
    }; 
    exports.Employee = Employee; 
}); 
define("Company", ["exports", "Employee"], function(Employee) { 
    function Company(name) { 
     this.name = name; 
     this.employees = []; 
    }; 
    Company.prototype.addEmployee = function(name) { 
     var employee = new Employee.Employee(name); 
     this.employees.push(employee); 
     employee.company = this; 
    }; 
    exports.Company = Company; 
}); 

jsfiddle

Проблема заключается в том, что, используя его собственный пример, то exports модуль не определен, и поэтому exports.Employee и exports.Company не задавать. Если я попытаюсь включить экспорт в качестве аргумента функции определения обратного вызова, он просто инициализирует в обоих случаях пустым и не несет функции конструктора, которые он назначил.

Что я делаю неправильно?

EDIT: Через пробную версию и ошибку я получил приведенный выше код, работающий по адресу: http://jsfiddle.net/jpk45vow/4/. Может кто-нибудь объяснить почему это работает, потому что это не имеет никакого смысла для меня.

+0

похоже, что модуль экспорта не является глобальным объектом. Он имеет локальную область в качестве помощника для экспорта ваших модулей. Вот почему он пуст в основном. Фактически, вам не нужно требовать его и не использовать в своем основном модуле. – amenadiel

+0

Да, после чтения ваших комментариев мне кажется, что то, что делает магический модуль, создает контейнерный объект, очень похожий на тот, который вы создали ниже, за исключением того, что каждый модуль имеет свой собственный контейнер. Затем, когда main требуется модуль, requireJS возвращает контейнер вместо модуля, разрешая все проблемы с зависимостями. –

ответ

3

Редактировать: Не удалось найти более подробную информацию о методе экспорта магии. Я мог бы, однако, подражать его предполагаемому поведению с манекеном «Контейнерный» модуль. См. Это в этой скрипке: http://jsfiddle.net/amenadiel/a7thxz98/

console.log("start"); 

define("Container",function() { 
    var Container={}; 
    return Container; 
}); 


define("Employee", ["Container"], function(Container) { 
    var Employee= function(name) { 
     this.name = name; 
     this.company = new Container.Company(name + "'s own company"); 
    }; 
    Container.Employee = Employee; 
}); 

define("Company", ["Container"], function(Container) { 
    var Company=function(name) { 
     this.name = name; 
     this.employees = []; 
    }; 
    Company.prototype.addEmployee = function(name) { 
     var employee = new Container.Employee(name); 
     this.employees.push(employee); 
     employee.company = this; 
    }; 
    Container.Company = Company; 
}); 

define("main", ["Container","Employee","Company" ], function (Container) { 
    var john = new Container.Employee("John"); 
    var bigCorp = new Container.Company("Big Corp"); 
    bigCorp.addEmployee("Mary"); 
    console.log(bigCorp); 
}); 

require(["main"]); 
+0

Да, как я уже сказал, когда я пытаюсь, объект 'export' инициализируется как пустой и не выполняет функции конструктора, которые ему были назначены. –

+0

Например: http://jsfiddle.net/jpk45vow/3/ –

+0

Кажется, что якобы модуль экспорта магии не делает то, что сказано. См. Мое редактирование – amenadiel

Смежные вопросы