如何在 Angular JS 中声明一个不是服务但不会污染全局范围的对象?
Posted
技术标签:
【中文标题】如何在 Angular JS 中声明一个不是服务但不会污染全局范围的对象?【英文标题】:How to declare an object in Angular JS that isn't a service but doesn't pollute the global scope? 【发布时间】:2013-12-18 16:58:07 【问题描述】:我后来发现我可以通过在我的工厂中使用 get() 方法来返回对象的实例,该方法返回新的服务实例。
但是,如果我的对象不是服务怎么办(这里讨论语义)。例如,我有一个页面上有很多图表,图表对象(下)不是(语义上的)服务。
那么我是否必须使用诸如工厂/提供者/等模式之类的东西来声明它?感觉不对,因为它实际上不是服务。但是我需要从我的控制器中引用它,所以它需要被注入,或者以某种方式访问。 & 我不希望它污染全球范围。
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);
;
;
【问题讨论】:
【参考方案1】:看看module.value()
。来自文档:
使用 $injector 注册一个值服务,例如字符串、数字、数组、对象或函数。这是注册服务的缩写,其中提供者的 $get 属性是一个工厂函数,不接受任何参数并返回值服务。
更新
不确定您是否仍然对此感兴趣,但我终于找到了您问题的正确答案 - 使用 $controller
服务。 HERE我做了一个简单的demo:
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
just 来表明 Angular 的 DI 将自动解析它知道的任何依赖项。其余的依赖项 [locals] 可以作为第二个参数传递给$controller
.)
【讨论】:
@Baconbeastnz 是的,确实。 我需要一个非单例。但是在任何情况下,是否应该在这些价值/工厂服务之一中声明任何自定义对象,一个人写的(当使用角度时)?不管语义是什么? (只是看起来在语义上不直观?以上是关于如何在 Angular JS 中声明一个不是服务但不会污染全局范围的对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Angular 2 / Typescript 中声明全局变量? [关闭]