Nel mio sistema, ho un certo numero di "classi" caricate nel browser ciascuna un file separato durante lo sviluppo e concatenate insieme per la produzione. Come si sono caricati, si inizializzare una proprietà su un oggetto globale, qui G
, come in questo esempio:Come gestire le dipendenze circolari con 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");
Invece di utilizzare il mio oggetto globale, sto considerando di rendere ogni classe di una propria AMD module, sulla base di 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");
});
il problema è che prima, non vi era alcuna dipendenza dichiarare-tempo tra dipendenti e azienda: si potrebbe mettere la dichiarazione in qualsiasi ordine si voleva, ma ora, con RequireJS, questo introduce una dipendenza, che è qui (intenzionalmente) circolare, quindi il codice sopra riportato fallisce. Naturalmente, in addEmployee()
, aggiungere una prima riga var Employee = require("Employee");
sarebbe make it work, ma vedo questa soluzione come inferiore a non utilizzare RequireJS/AMD in quanto richiede a me, lo sviluppatore, di essere a conoscenza di questa dipendenza circolare appena creata e di fare qualcosa al riguardo.
Esiste un modo migliore per risolvere questo problema con RequireJS/AMD oppure sto utilizzando RequireJS/AMD per qualcosa per cui non è stato progettato?
ho pensato che tu avessi dichiarare esportazioni in entrambe le richiamate lista di argomenti, come 'function (exports, Company)' e 'function (exports, Employee)'. Comunque, grazie per RequireJS, è stupendo. –
@jrburke Penso che questo possa essere fatto in modo unidirezionale, per un mediatore o core o altro componente top-down? È un'idea terribile, per renderla accessibile usando entrambi i metodi? http://stackoverflow.com/questions/11264827/circular-dependencies-in-modules-using-requirejs/17666014#17666014 – SimplGy
Non sono sicuro di aver capito come questo risolva il problema. La mia comprensione è che tutte le dipendenze devono essere caricate prima dell'esecuzione di define. Non è questo il caso se "esportazioni" viene passato come prima dipendenza? –