En mi sistema, tengo una serie de "clases" cargadas en el navegador, cada una de ellas en archivos separados durante el desarrollo, y concatenadas para la producción. A medida que se cargan, inicializan una propiedad en un objeto global, aquí G
, como en este ejemplo:
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 usar mi propio objeto global, estoy considerando hacer que cada clase sea su propio módulo AMD , según la sugerencia de James Burke :
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");
});
El problema es que antes, no había dependencia de tiempo de declaración entre el Empleado y la Compañía: podía colocar la declaración en el orden que quisiera, pero ahora, usando RequireJS, esto introduce una dependencia, que está aquí (intencionalmente) circular, por lo que el falla el código anterior. Por supuesto, addEmployee()
agregar una primera línea var Employee = require("Employee");
lo haría funcionar , pero veo esta solución como inferior a no usar RequireJS / AMD, ya que requiere que yo, el desarrollador, esté al tanto de esta dependencia circular recién creada y haga algo al respecto.
¿Existe una mejor manera de resolver este problema con RequireJS / AMD, o estoy usando RequireJS / AMD para algo para lo que no fue diseñado?
function(exports, Company)
andfunction(exports, Employee)
. Anyway, thanks for RequireJS, it's awsome.