我发现我可以通过在工厂中使用get()方法返回对象的实例,返回新的服务实例。
但是如果我的对象不是服务(在这里谈论语义)会怎样。 E.G我有一个页面上有很多图表,图表对象(下面)不是(语义上)服务。
所以我必须使用像factory / provider / etc模式这样的东西声明它吗?这感觉不对,因为它实际上并不是一项服务。但我需要从我的控制器中引用它,因此需要注入或以某种方式访问它。 &安培;我不希望它污染全球范围。
var Chart = function () {
var self = this;
this.initialize = function (name, clientMethod, usingDateRange, usesAnalytics, initCB, serviceCB, highchartsConfig) {
this.name = name;
this.clientMethod = clientMethod;
this.usingDateRange = usingDateRange;
this.usesAnalytics = usesAnalytics;
this.initCB = initCB;
this.serviceCB = serviceCB;
this.highchartsConfig = highchartsConfig;
this.$chart = $('#' + name);
this.isIncluded = false;
this.highchartsConfig.chart.renderTo = this.name;
this.initCB && this.initCB(this);
};
};
答案 0 :(得分:5)
看看module.value()
。来自doc:
使用$ injector注册值服务,例如字符串,数字,数组,对象或函数。这是注册服务的简称,其服务提供者的$ get属性是一个不带参数的工厂函数,并返回值服务。
不确定您是否仍对此感兴趣,但我终于找到了正确答案 - 使用$controller
服务。 HERE我创建了一个简单的演示:
app.controller('MainCtrl', function($scope, $controller) {
function Person($interpolate, name, surname){
var greetStr = "Hello {{name + ' ' + surname}}!";
var greetExp = $interpolate(greetStr);
this.greet = greetExp({name:name, surname:surname});
}
$scope.person1 = $controller(Person, {name:"Jack", surname:"Daniels"});
$scope.person2 = $controller(Person, {name:"Johny", surname:"Walker"});
});
(我使用$interpolate
只是来表明angular的DI会自动解析它所知道的任何依赖项。其余的依赖项[locals]可以作为第二个传递$controller
的参数。)