В моей системе у меня есть несколько «классов», загруженных в обозревателе, каждый отдельный файл во время разработки и объединенный вместе для производства. Как они загружены, они инициализирует свойство на глобальный объект, здесь G
, как в этом примере:Как обрабатывать круговые зависимости с RequireJS/AMD?
var G = {};
G.Employee = function(name) {
this.name = name;
this.company = new G.Company(name + "'s own company");
};
G.Company = function(name) {
this.name = name;
this.employees = [];
};
G.Company.prototype.addEmployee = function(name) {
var employee = new G.Employee(name);
this.employees.push(employee);
employee.company = this;
};
var john = new G.Employee("John");
var bigCorp = new G.Company("Big Corp");
bigCorp.addEmployee("Mary");
Вместо того, чтобы использовать свой собственный глобальный объект, я рассматриваю, чтобы каждый класс свой собственный AMD module, основанный на James Burke's suggestion:
define("Employee", ["Company"], function(Company) {
return function (name) {
this.name = name;
this.company = new Company(name + "'s own company");
};
});
define("Company", ["Employee"], function(Employee) {
function Company(name) {
this.name = name;
this.employees = [];
};
Company.prototype.addEmployee = function(name) {
var employee = new Employee(name);
this.employees.push(employee);
employee.company = this;
};
return Company;
});
define("main", ["Employee", "Company"], function (Employee, Company) {
var john = new Employee("John");
var bigCorp = new Company("Big Corp");
bigCorp.addEmployee("Mary");
});
вопрос заключается в том, что до того, не было DECLARE-временная зависимость между Работником и компанией: вы можете поместить объявление в любом порядке, что вы хотели, но сейчас, используя RequireJS, это вводит зависимость, которая здесь (намеренно) круговой, поэтому приведенный выше код не работает. Конечно, в addEmployee()
добавление первой строки var Employee = require("Employee");
было бы make it work, но я вижу это решение как уступающее отсутствию использования RequireJS/AMD, поскольку оно требует от меня, разработчика, знать об этой вновь созданной циклической зависимости и что-то делать с ней.
Есть ли лучший способ решить эту проблему с RequireJS/AMD, или я использую RequireJS/AMD для чего-то, для чего он не предназначен?
Я думал, вы должны были объявить экспорт в обоих обратных вызовов список аргументов, например 'function (export, Company)' и 'function (export, Employee)'. В любом случае, спасибо за RequireJS, это просто. –
@jrburke Я думаю, что это можно сделать в одностороннем порядке, для медиатора или ядра или другого компонента сверху вниз? Это ужасная идея, чтобы сделать ее доступной с использованием обоих методов? http://stackoverflow.com/questions/11264827/circular-dependencies-in-modules-using-requirejs/17666014#17666014 – SimplGy
Я не уверен, что понимаю, как это решает проблему. Я понимаю, что все зависимости должны быть загружены до запуска define. Не так ли, если «экспорт» передается в качестве первой зависимости? –