2012-11-15 32 views
6

Tôi đang sử dụng AngularJS 1.0.2 với jQuery 1.8.2 và tôi đang cố gắng để có AngularJS tiêm phụ thuộc vào đối tượng, giống như nó làm cho bộ điều khiển. Bạn có thể tìm thấy một ví dụ cơ bản trên jsFiddle, trong đó bạn sẽ tìm thấy hai bộ điều khiển (ListNewItem), một đối tượng (Item) và mô-đun có dịch vụ (tương ứng là servicescommunication).Có AngularJS tiêm phụ thuộc vào đối tượng như nó đã làm cho bộ điều khiển

Vấn đề của tôi là với Item:

var Item = function (name, price) { 
    var self = this; 

    self.name = name; 
    self.price = price; 

    self.pretty = function() { 
     return self.name + ": " + self.price; 
    }; 
}; 

Trong đó tôi cần phải sử dụng một số điều bên ngoài, chúng ta hãy nói rằng tôi muốn phương pháp pretty để định dạng price tài sản cho một chuỗi tiền tệ-aware:

self.pretty = function() { 
    return self.name + ": " + $filter("currency")(self.price); 
}; 

Nhưng điều này sẽ không hoạt động vì $filter không được xác định. (Tâm trí bạn, việc sử dụng $filter chỉ là một ví dụ, nó có thể là bất cứ điều gì.)

Và sửa đổi var Item = function (name, price) { để var Item = function ($filter, name, price) { sẽ không làm việc quá, vì nó không phải AngularJS của những người tạo ra các đối tượng (như trong trường hợp của các bộ điều khiển), tôi đây.

Vì vậy, làm thế nào tôi có thể có AngularJS tạo đối tượng cho tôi, hoặc có nó giải quyết sự phụ thuộc tôi cần?

Something như var item = angular.create(Item, $scope.name, $scope.price); hoặc var item = new Item(angular.inject("filter"), $scope.name, $scope.price); Tôi nghĩ ...

Trả lời

16

Có thể hỏi AngularJS để nhanh chóng đối tượng của riêng bạn (và tiêm phụ thuộc vào họ!) Bằng cách sử dụng các dịch vụ và phương pháp $injectorinstantiate(Type, locals) của nó.

Ví dụ, cho một nhà xây dựng như thế này:

var Item = function ($filter, name, price) { 
    var self = this; 

    self.name = name; 
    self.price = price; 

    self.pretty = function() { 
     return $filter('json')(self); 
    }; 
}; 

người ta có thể tạo ra một thể hiện của Item như vậy:

var item = $injector.instantiate(Item, { name: $scope.name, price: $scope.price }); 

Xin lưu ý rằng phương pháp instantiate chấp nhận 2 đối số:

  • Loại: hàm xây dựng.
  • người dân địa phương: một giá trị băm nên không được được tiêm mà đúng hơn là được thực hiện.

Đây là working jsFiddle (phiên bản đơn giản của phiên bản đầu tiên).

+2

Đây chính xác là những gì tôi đang tìm kiếm. Tôi * đã * nhìn vào trang tài liệu '$ injector', nhưng bỏ lỡ' instantiate (type, local) '... Sigh ... – Albireo

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