私人角度服务或控制器

时间:2015-02-23 17:48:26

标签: angularjs

我有一个包含一些“私人”服务的角度模块。这些私有服务仅在同一模块中的其他服务中需要,并且将它们公开以进行测试是有意义的。但我不希望其他模块使用此服务。

是否有可能将此类服务标记为“私人”?是否至少有一个约定来命名这些服务,以便其他人将它们识别为私有?

1 个答案:

答案 0 :(得分:1)

如果你需要这些"类的唯一原因"成为角度服务是无痛地注入其依赖项,您可以使用$injector.instantiate实例化它们而不将它们注册为服务。

示例代码:

var PrivateClass = (function () {
    function PrivateClass($log) {
        this.hello = function () { $log.debug("Hello World!");}
    }
    PrivateClass.$inject = ["$log"];
    return PrivateClass;
})();

angular.module('TestApp', []).run(['$injector', function ($injector) {
    var p = $injector.instantiate(PrivateClass);
    p.hello();
}]);

您可以在需要它的服务中的构造函数(或任何位置)中使用$injector.instantiate(PrivateClass)来创建PrivateClass的实例。如果你需要PrivateClass表现得像一个单例(就像一个真正的角度服务),你可以使用一个实例化它的访问器类,并返回它对调用者的引用。

这样做的好处是你不需要污染实例化服务(在这种情况下是传递给angular.run的函数),只有需要的依赖项的依赖数组才能将它们传递给PrivateClass (在这种情况下是$ log)。

我注意到这是一个有问题的问题但是,我在寻找实现上述目标的方法时发现了这一点,并最终使用这种方法解决了这个问题。