如何在Angular JS中声明一个不是服务但不污染全局范围的对象?

Bac*_*tnz 2 angularjs angular-services

我发现我可以通过在工厂中使用get()方法返回一个对象的实例,该方法返回新的服务实例.

但是如果我的对象不是服务(在这里谈论语义)会怎样.EG我有一个页面上有很多图表,图表对象(下面)不是(语义上)服务.

所以我必须使用像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);
    };
};
Run Code Online (Sandbox Code Playgroud)

art*_*iak 5

看看module.value().来自doc:

使用$ injector注册值服务,例如字符串,数字,数组,对象或函数.这是注册服务的简称,其服务提供者的$ get属性是一个不带参数的工厂函数并返回值服务.

UPDATE

不确定你是否仍然对它感兴趣,但我终于找到了你的问题的正确答案 - 使用该$controller服务.在这里我创建了一个简单的演示:

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"});
});
Run Code Online (Sandbox Code Playgroud)

(我用的$interpolate 只是表明角的DI会自动解决任何依赖它是知道的.相关性[当地人]其余的可以作为第二个参数传递$controller.)