9

Đọc tài liệu requireJs,
để sửa phụ thuộc Thông tư, được đề xuất sử dụng exports để tạo đối tượng trống cho mô-đun có sẵn ngay lập tức.Phụ thuộc thông tư trong mô-đun bằng cách sử dụng requireJs

Tôi thử mã này nhưng có vẻ như nó không hoạt động. Chuyện gì thế?

P.S .:
đọc nhận xét để xem đầu ra,
đặc biệt là mô-đun B bên trong cuộc gọi setTimeout.


// A module 
define([ 
    'b' 
], function (b) { 
    console.log('B:', b); // B, Object 
    var A = { 
     boo: 1 
    }; 

    return A; 
}); 

// B module 
define([ 
    'a', 
    'exports' 
], function (a, exports) { 
    console.log('A:', a); // A, undefined (as I was expecting) 
    exports.A = function() { 
     return a; 
    } 

    var B = { 
     bar: 1 
    }; 

    setTimeout(function() { 
     console.log('exports.A', exports.A()); // exports.A undefined 
              // I would like to access the A object 
              // which is defined in A module 
    }, 500); 

    return B; 
}); 

// main.js 

(function() { 

    define([ 
     'a' 
    ], function() { 
    }); 
}()); 
+0

Tôi nghĩ điều này có thể hữu ích http://stackoverflow.com/questions/4771025/understanding-when-and-how-to-use-require-js?rq=1 – Jake

+0

@ lorraine-bernand Bạn đã tìm ra cách để giải quyết điều này? Liên kết ở trên không cho tôi đủ xử lý để giải quyết nó. – donnut

+0

Tôi ước điều này là một câu hỏi được trả lời. Tôi chạy vào tất cả các thời gian :) – SimplGy

Trả lời

0

tôi thường có những vấn đề hình tròn sử dụng module AMD để xây dựng một cốt lõi ứng dụng mà cả hai đứng lên nhiều mô-đun và chứa cấu hình hoặc các vật dụng hữu ích khác đối với những người mô-đun để sử dụng.

Tôi đã làm một số thử nghiệm ngày hôm nay và điều này dường như hoạt động khá tốt.

define(['exports', 'underscore', './config', './mediator'], 
    function (exports, _, Backbone, config, Mediator){ 

    Core = /* ... */ 

    // Publicize a core 'singleton' so that it's dependencies can access it, and so can modules that define it as a dependency themselves. 
    core = new Core() 
    exports.core = core //publicize it in a way that supports circularity 
    return core // And also publicize it normally 
    } 
) 

Các đối tượng đều '===' bằng nhau, vì vậy điều này có vẻ rất hứa hẹn.

EDIT:

Phương thức trên không hoạt động khi được tối ưu hóa. Đây là một phương pháp mà có thể (chưa được kiểm tra): https://github.com/requirejs/example-multipage/blob/master/www/js/app/main1.js#L2

define(function (require) { 
    var $ = require('jquery'), 
     lib = require('./lib'), 
     Core; 

    Core = /* ... */ 

    return new Core() 
}); 
+0

Thực ra, tôi sẽ không sử dụng phương pháp này. Nó hoạt động cho mã không được tối ưu hóa nhưng nếu bạn chạy trình tối ưu hóa trên đó, xuất khẩu của bạn không có sẵn, trông giống như. – SimplGy

+0

Tôi đang vật lộn với vấn đề này phụ thuộc vòng tròn bản thân mình ngay bây giờ, do đó, tự hỏi nếu bạn có một đề nghị thay thế –

+0

Thật không may là không. Nó đã được một vấn đề cho năm hoặc vì vậy tôi đã sử dụng RequireJS và CurlJS để quản lý mô-đun ứng dụng. 'Giải pháp' của tôi là chuyển một tham chiếu đến đối tượng hòa giải tới mọi thứ mà người hòa giải phụ thuộc vào, và bắt đầu một chuỗi phụ thuộc mới ở cấp 'trang'. Điều này trông giống như thế này: https://github.com/SimpleAsCouldBe/appCore/blob/master/shared/appCore/app.js#L45 Nó không phải là tuyệt vời mặc dù. Tôi muốn có thể luôn luôn nhận được sự phụ thuộc của tôi thông qua tuyên bố: ( – SimplGy

0

Một lựa chọn sẽ được không trở lại các module chính nó, nhưng một chức năng mà instantiates module (trong ví dụ này nó sẽ là một nhà xây dựng theo quy định tại nguyên cảo, ở phía dưới là tạo js đang -Lưu ý rằng giao diện không tạo .js đang)

  • file IA.ts

    /// <reference path="IB.ts" /> 
    interface IA{ 
        funcA(); 
        _classB : IB; 
    } 
    
  • file IB.ts

    /// <reference path="IA.ts" /> 
    interface IB{ 
        funcB(); 
        _classA : IA; 
    } 
    
  • ClassA.ts file

    /// <reference path="IA.ts" /> 
    /// <reference path="IB.ts" /> 
    
    export class ClassA implements IA 
    { 
        _classB : IB = null; 
    
        constructor(classB : IB) 
        { 
         this._classB = classB; 
         if (classB){ 
          this._classB._classA = this; 
         } 
         return this; 
        } 
    
        funcA(){ 
         console.log('I am ClassA'); 
        } 
    } 
    
  • ClassB.ts file

    /// <reference path="IA.ts" /> 
    /// <reference path="IB.ts" /> 
    export class ClassB implements IB 
    { 
        _classA : IA = null; 
        constructor(classA : IA) 
        { 
         this._classA = classA; 
         if (classA){ 
          this._classA._classB = this; 
         } 
         return this; 
        } 
        funcB(){ 
         console.log('I am ClassB'); 
        } 
    } 
    
  • MainTest.ts file

    /// <reference path="../../def/require.d.ts" /> 
    /// <reference path="IA.ts" /> 
    /// <reference path="IB.ts" /> 
    define(['ClassA', 'ClassB'], 
        function (classA, classB) 
        { 
         var aa : IA = new classA.ClassA(); 
         var bb : IB = new classB.ClassB(aa); 
    
         bb.funcB(); 
         aa._classB.funcB(); 
         bb._classA.funcA(); 
         aa.funcA(); 
        }); 
    

Và mã được tạo js:

  • file ClassA.js

    define(["require", "exports"], function(require, exports) { 
        var ClassA = (function() { 
         function ClassA(classB) { 
          this._classB = null; 
          this._classB = classB; 
          if (classB) { 
           this._classB._classA = this; 
          } 
          return this; 
         } 
         ClassA.prototype.funcA = function() { 
          console.log('I am ClassA'); 
         }; 
         return ClassA; 
        })(); 
        exports.ClassA = ClassA; 
    }); 
    
  • file ClassB.js

    define(["require", "exports"], function(require, exports) { 
        var ClassB = (function() { 
         function ClassB(classA) { 
          this._classA = null; 
          this._classA = classA; 
          if (classA) { 
           this._classA._classB = this; 
          } 
          return this; 
         } 
         ClassB.prototype.funcB = function() { 
          console.log('I am ClassB'); 
         }; 
         return ClassB; 
        })(); 
        exports.ClassB = ClassB; 
    }); 
    
  • file MainTest.js

    define(['ClassA', 'ClassB'], function (classA, classB) { 
    
        var aa = new classA.ClassA(); 
        var bb = new classB.ClassB(aa); 
    
        bb.funcB(); 
        aa._classB.funcB(); 
        bb._classA.funcA(); 
        aa.funcA(); 
    
    }); 
    

cuối cùng, kết quả sẽ là:

Tôi ClassB

Tôi ClassB

Tôi ClassA

Tôi ClassA

1

Bạn sẽ có thể sử dụng phiên bản đồng bộ require() trong mô-đun B của bạn để truy cập vào "A" mô-đun:

// B module 
define([ 
    'a', 
    'exports' 
], function (a, exports) { 
    console.log('A:', a); // A, undefined (as I was expecting) 
    exports.A = function() { 
     return require('a'); 
    } 
    ... 
}); 
Các vấn đề liên quan