6

我正在使用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);我认为...

4

1 回答 1

16

可以使用$injector服务及其instantiate(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);
    };
};

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

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

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

  • 类型:构造函数。
  • locals:应该注入而是按原样获取的值的哈希值。

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

于 2012-11-15T18:49:57.363 回答