我正在使用AngularJS 1.0.2和jQuery 1.8.2并且我正在尝试让AngularJS将依赖项注入到对象中,就像它对控制器一样。您可以在jsFiddle找到一个基本示例,在那里您将找到两个控制器(List
和NewItem
),一个对象(Item
)和一个带有服务的模块(分别命名为services
和communication
。
我的问题在于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);
......
答案 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个参数:
这是working jsFiddle(初始版本的简化版本)。