En mi sistema, tengo varias "clases" cargadas en el navegador, cada una en un archivo por separado durante el desarrollo, y se unen para su producción. A medida que se cargan, que inicializar una propiedad de un objeto global, aquí G
, como en este ejemplo:¿Cómo manejar las dependencias circulares 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");
En lugar de utilizar mi propio objeto global, estoy considerando hacer cada clase su propio AMD module, basado en 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");
});
la cuestión es que antes, no había ninguna dependencia en tiempo de declarar entre el empleado y la empresa: se puede poner la declaración en el orden que quería, pero ahora, el uso de RequireJS, esto introduce una dependencia, lo cual está aquí (intencionalmente) circular, por lo que el código anterior falla. Por supuesto, en addEmployee()
, agregando una primera línea var Employee = require("Employee");
sería make it work, pero veo esta solución como inferior a no usar RequireJS/AMD ya que me requiere, el desarrollador, estar al tanto de esta dependencia circular recién creada y hacer algo al respecto.
¿Existe alguna forma mejor de resolver este problema con RequireJS/AMD, o estoy usando RequireJS/AMD para algo para lo que no fue diseñado?
pensé que tenía que declarar las exportaciones en ambos devoluciones de llamada lista de argumentos, como 'function (exports, Company)' y 'function (exports, Employee)'. De todos modos, gracias por RequireJS, es impresionante. –
@jrburke Creo que esto se puede hacer en una dirección correcta, para un mediador o núcleo u otro componente de arriba hacia abajo? ¿Es esta una idea terrible, para hacerla accesible usando ambos métodos? http://stackoverflow.com/questions/11264827/circular-dependencies-in-modules-using-requirejs/17666014#17666014 – SimplGy
No estoy seguro de entender cómo esto resuelve el problema. Según entiendo, todas las dependencias deben cargarse antes de las ejecuciones de definición. ¿No es ese el caso si se pasa "exportaciones" como la primera dependencia? –