让AngularJS将依赖项注入对象,就像它已经为控制器做的那样

时间:2012-11-15 10:51:07

标签: javascript dependency-injection angularjs

我正在使用AngularJS 1.0.2和jQuery 1.8.2并且我正在尝试让AngularJS将依赖项注入到对象中,就像它对控制器一样。您可以在jsFiddle找到一个基本示例,在那里您将找到两个控制器(ListNewItem),一个对象(Item)和一个带有服务的模块(分别命名为servicescommunication

我的问题在于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); ......

1 个答案:

答案 0 :(得分: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个参数:

  • 类型:构造函数。
  • locals:应该注入的值的哈希值,而不是按原样使用。

这是working jsFiddle(初始版本的简化版本)。