2014-09-15 16 views
5

Tôi đang viết một ứng dụng trình duyệt và tôi có một tệp tạo đối tượng và khởi tạo nó. Ứng dụng được viết bằng AngularJS, nhưng tệp được đề cập là Javascript đơn giản, bên ngoài hệ sinh thái Góc.

Tôi muốn sử dụng lời hứa trong tệp đó, nhưng vì Angular có chứa an implementation của Q, tôi chỉ muốn sử dụng hơn là đưa vào thư viện khác.

Tôi cũng đang sử dụng RequireJS.

Vì vậy, có cách nào để sử dụng $ q trong tệp không phải là Góc không?

+0

tôi không thấy lý do tại sao không chuyển nó vào thời điểm thích hợp. –

Trả lời

9

Bạn có thể làm điều này bằng cách sử dụng phương pháp angular.injector() mà trả về một chức năng $injector có thể được tiêm phụ thuộc mà bạn cần (ví dụ $http, $q) thông qua phương pháp invoke() của nó.

DEMO

Something như thế này:

angular.injector(['ng']).invoke(['$q', function($q) { 

    $q.when('hello world').then(function(message) { 
    window.alert(message); 
    }); 

}]); 

Lưu ý rằng các mảng truyền cho angular.injector() là danh sách các mô-đun, tôi bao gồm các module ng vì đó là nơi mà sự phụ thuộc lõi AngularJS nằm .

+0

Nhưng theo cách này, '' $ q'' sẽ sử dụng '' $ rootScope'' khác với phần còn lại của ứng dụng. Vì vậy, bằng cách sử dụng '' $ rootScope. $ Apply() '' trên "bình thường" '' $ rootScope'' (ví dụ: trong các bài kiểm tra đơn vị) sẽ không hoạt động cho '' $ q'', phải không? – Ignitor

+0

@Ignitor. Điều đó không nhất thiết đúng, mô-đun 'ng' được bổ sung về mặt kỹ thuật làm phụ thuộc cho tất cả các mô-đun. Do đó '$ rootScope' cho mô-đun mà bạn tạo cũng chia sẻ' $ rootScope' của mô-đun 'ng'. Kể từ khi viết nhận xét này, phiên bản angular.js là 1.5.8, bạn sẽ thấy rằng mô-đun 'ng' được thêm vào làm mô-đun mặc định cho tất cả các mô-đun trong quá trình khởi động, [** trong dòng này **] (https://github.com/angular/angular.js/blob/v1.5.8/src/Angular.js#L1688). Ngoài ra, các dịch vụ angularjs, nhà cung cấp, nhà máy và giá trị gốc nằm trong mô-đun này. – ryeballar

+0

Chỉ cần thử nó: Tôi đã lưu một tham chiếu đến '' $ rootScope'' trong một bộ điều khiển và so sánh nó với '' $ rootScope'' tôi đã có từ đây: '' angular.injector (['ng']) .invoke (['$ rootScope', hàm ($ rootScope) { console.dir ($ rootScope); }]) ''. Họ làm * không * phù hợp và thậm chí có '' $ id' 'khác nhau. – Ignitor

Các vấn đề liên quan