2012-11-15 26 views
6

我使用AngularJS 1.0.2與1.8.2 jQuery,我想有AngularJS依賴注入的對象,像它的控制器。你可以在jsFiddle找到一個基本的例子,在那裏你會發現兩個控制器(ListNewItem),一個對象(Item)和一個服務模塊(分別命名爲servicescommunication)。有AngularJS依賴注入對象,如它已經確實爲控制器

我的問題是Item

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

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

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

在這裏面我需要在室外使用一些東西,比方說,我想pretty方法將price財產格式化爲貨幣感知字符串:

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

但是這不起作用,因爲$filter沒有定義。 (請注意,的$filter使用僅僅是一個例子,它可以是任何東西。)

和修改var Item = function (name, price) {var Item = function ($filter, name, price) {不會太工作,因爲這不是誰的創建對象(如控制器的情況下AngularJS ), 是我。

那麼,我該如何讓AngularJS爲我創建對象,還是讓它解決我需要的依賴關係?

喜歡的東西var item = angular.create(Item, $scope.name, $scope.price);var item = new Item(angular.inject("filter"), $scope.name, $scope.price);我想......

回答

16

它可以讓AngularJS實例自己的對象(和依賴注入他們!)使用$injector服務及其instantiate(Type, locals)方法。

例如,給定這樣的構造:

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

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

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

人能像這樣創建的Item一個實例:

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

請注意:instantiate方法接受2個參數:

  • 類型:構造函數。
  • 當地居民:值得散列的值應該是而不是被注入,而是按原樣。

這裏是一個working jsFiddle(最初的一個簡化版本)。

+2

這正是我所期待的。我*曾*查看過'$ injector'文檔頁面,但錯過了'實例化(類型,本地)'......唉...... – Albireo