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

Alb*_*reo 6 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;
    };
};
Run Code Online (Sandbox Code Playgroud)

在其中我需要使用外部的一些东西,假设我希望该pretty方法将price属性格式化为货币识别字符串:

self.pretty = function () {
    return self.name + ": " + $filter("currency")(self.price);
};
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为$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);我想......

pko*_*rce 16

通过使用$ injector服务及其实例化(Type,locals)方法,可以要求AngularJS实例化您自己的对象(并将依赖项注入它们!).

例如,给定一个这样的构造函数:

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

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

    self.pretty = function () {
        return $filter('json')(self);
    };
};
Run Code Online (Sandbox Code Playgroud)

可以创建一个Item像这样的实例:

var item = $injector.instantiate(Item, { name: $scope.name, price: $scope.price });
Run Code Online (Sandbox Code Playgroud)

请注意,该instantiate方法接受2个参数:

  • 类型:构造函数.
  • locals:应该注入但是按原样使用的值的哈希值.

这是一个有效的jsFiddle(初始版本的简化版本).

  • 这正是我所寻找的.我曾*看过`$ injector` doc页面,但错过了`实例化(类型,本地人)`......叹息...... (2认同)