私人角度服务或控制器

Tho*_*och 6 angularjs

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

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

Sam*_*era 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();
}]);
Run Code Online (Sandbox Code Playgroud)

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

这样做的优点是,您不需要污染实例化服务(在本例中为传递给 angular.run 的函数)的依赖项数组,其依赖项仅需要它们才能传递给 PrivateClass(在本例中为 $log) 。

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