SORU
2 ŞUBAT 2011, ÇARŞAMBA


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
3 ŞUBAT 2011, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • DrePwn

    DrePwn

    22 Temmuz 2011
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007