W moim systemie, mam kilka „klas” załadowane w przeglądarce każdy oddzielnych plikach w trakcie rozwoju i sklejone do produkcji. Ponieważ są one ładowane one zainicjować własność na globalnym obiektu, tutaj G
, jak w poniższym przykładzie:Jak obsługiwać zależności cykliczne z 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");
Zamiast własną globalny obiekt, Zastanawiam się, aby każda klasa własny AMD module, na podstawie 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");
});
kwestia jest taka, że wcześniej nie było uzależnienie stwierdzenie w czasie między pracownikiem a Spółką: można umieścić deklarację, w dowolnej kolejności chciał, ale teraz, przy użyciu RequireJS ta wprowadza zależność, która jest tutaj (celowo) okrągły, więc powyższy kod kończy się niepowodzeniem. Oczywiście w addEmployee()
dodanie pierwszej linii var Employee = require("Employee");
spowoduje make it work, ale uważam, że to rozwiązanie jest gorsze od używania RequireJS/AMD, ponieważ wymaga ode mnie, programisty, bycia świadomym tej nowo utworzonej zależności cyklicznej i zrobienia czegoś z tym.
Czy istnieje lepszy sposób na rozwiązanie tego problemu z RequireJS/AMD, lub używam RequireJS/AMD czegoś nie został zaprojektowany do?
Myślałem, trzeba było zadeklarować eksportu w obu wywołań zwrotnych lista argumentów, np. 'funkcja (eksport, firma)' i 'funkcja (eksport, pracownik)'. W każdym razie, dzięki dla RequireJS, to jest niesamowite. –
@jrburke Myślę, że można to zrobić w jednokierunkowy sposób, w przypadku mediatora, rdzenia lub innego odgórnego komponentu? Czy to okropny pomysł, aby był dostępny za pomocą obu metod? http://stackoverflow.com/questions/11264827/circular-dependencies-in-modules-using-requirejs/17666014#17666014 – SimplGy
Nie jestem pewien, czy rozumiem, jak to rozwiązuje problem. Rozumiem, że wszystkie zależności muszą być załadowane przed uruchomieniem definiowania. Czy nie jest tak, jeśli "eksport" jest przekazywany jako pierwsza zależność? –