Nasıl RequireJS/AMD ile dairesel bağımlılıkları işlemek için?
Benim sistemimde, "sınıflar" ayrı gelişme döneminde dosyaları ve üretimi için birlikte birleştirilmiş. tarayıcı her yüklenen bir dizi var Yüklü olduğu gibi, küresel bir nesne, işte bu örnekte olduğu gibi G
, bir özelliği başlatılamıyor:
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");
Kendi küresel bir nesne kullanmak yerine, her sınıf kendi yapmayı düşünüyorum 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");
});
Bu konu daha önce vardı hayır ilan-zamana bağımlılık arasında Çalışan ve Şirket: sen-ebil koymak bildiriminde neyse sipariş istedim, ama şimdi, kullanarak RequireJS, bu tanıtır bir bağımlılık olan burada (kasıtlı olarak) dairesel, yani yukarıdaki kod başarısız olur. Elbette, addEmployee()
, ekleme, ilk satır var Employee = require("Employee");
make it work ama görüyorum ki bu çözüm gibi kalitesiz değil kullanarak RequireJS/AMD gibi gerekli bana, geliştirici, dikkat edilecek bu yeni oluşturulan döngüsel bağımlılık ve bir şey yap.
Daha iyi bir yol RequireJS ile bu sorunu çözmek için/AMD var, ya da bir şey için AMD/RequireJS kullanarak değildi tasarlanmış mıyım?
CEVAP
Bu gerçekten AMD biçiminde bir kısıtlama. İhracat kullanabilirsiniz, ve bu problem ortadan kalkıyor. İhracat çirkin buluyorum, ama düzenli CommonJS sorunu çözmek modülleri nasıl:
define("Employee", ["exports", "Company"], function(exports, Company) {
function Employee(name) {
this.name = name;
this.company = new Company.Company(name "'s own company");
};
exports.Employee = Employee;
});
define("Company", ["exports", "Employee"], function(exports, Employee) {
function Company(name) {
this.name = name;
this.employees = [];
};
Company.prototype.addEmployee = function(name) {
var employee = new Employee.Employee(name);
this.employees.push(employee);
employee.company = this;
};
exports.Company = Company;
});
Aksi takdirde, require ("") Çalışan Mesajınızı çok çalışacağına söz.
Dairesel bağımlılıkları daha fazla dikkat etmeniz gerekir modülleri ile genel olarak, AMD ya da değil. Hatta düz JavaScript, emin örnekte G nesnesi gibi bir nesne kullanın.
Nasıl RequireJS birim test için sahte ...
Nasıl ilerleme iletişim ve arka plan i...
Nasıl gıt sayısı işlemek için?...
Nasıl düğmeye tıklama Parçaları içinde...
Nasıl Git grep belirli bir kelime için...