如何在 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 测试文件中的所有导入

如何在angular js中对登录服务进行base64编码

Angular:在组件内使用通用组件

如何在 Angular 2 / Typescript 中声明全局变量? [关闭]

如何检查数据是不是已完成加载以使用异步管道 Angular 8

如何使用 TypeScript 在我的 Angular 2 组件中声明模型类?