从另一个模块获取对象(控制器,服务或指令的功能)

时间:2014-03-17 18:56:03

标签: angularjs dependency-injection

是否可以访问位于同一模块或不同模块中的功能?

类似的东西:

var fooDir = angular.module("directives").get("foo")

......或:

var myCtrl = angular.module("app").controllers["myCtrl"]

我想服务我们可以使用注射器:

inj = angular.injector(['myServicesModule'])
$myService = inj.get('$myService')

...但是它适用于控制器和指令吗?

1 个答案:

答案 0 :(得分:14)

获取注射器

来自模块的注入器

例如,假设您拥有自己的模块test,以获取空的注入器并且未附加到DOM应用程序实例:

angular.injector(['ng', 'test']);


来自现有应用程序的注入器

例如,要使应用程序的注入器管理标识为test的所选节点:

angular.element(document.getElementById('test')).injector();


从进样器中获取实例

假设您将注射器作为injector变量


获取服务实例

获取$rootScope实例:

injector.get('$rootScope');


获取控制器实例

假设您获得名为TestCtrl的控制器:

injector.get('$controller')('TestCtrl', { $scope: {} });


获取带有编译指令的元素

假设您有一个指令测试,以获取针对$rootScope的编译元素:

injector.get('$compile')('<div a/>')(injector.get('$rootScope'));


来自角度jqLit​​e或jQuery的助手

除了injector获取jqLit​​e或jQuery集合的注入器之外,您可以假设jqLit​​e或jQuery集合将应用程序中存在的附加DOM元素包装为变量$element


获取附加到DOM元素

的控制器实例
$element.controller();


获取附加到DOM元素

的范围实例
$element.scope();


获取附加到DOM元素

的隔离范围实例
$element.isolateScope();


获取通过angular附加到DOM元素的隐藏数据

$element.inheritedData();


  

此外,每次获得的是JavaScript构造函数(服务,控制器)的实例,您都可以使用实例的constructor属性来获取此构造函数。


注册服务,控制器等列表

没有公开的注册服务,控制器等列表。但是,您可以覆盖提供者方法,例如,获取在模块“ng”之上发生的注册:

angular.module('ng').config(
    function ($provide, $compileProvider, $controllerProvider) {

        angular.forEach(['service', 'provider', 'controller'], function (m) {
            var _m = $provide[m];
            $provide[m] = function () {
                console.log('$provide', m, arguments);
                return _m.apply($provide, arguments);
            };
        });

        angular.forEach(['directive'], function (m) {
            var _m = $compileProvider[m];
            $compileProvider[m] = function () {
                console.log('$compileProvider', m, arguments);
                return _m.apply($compileProvider, arguments);
            };
        });

        angular.forEach(['register'], function (m) {
            var _m = $controllerProvider[m];
            $controllerProvider[m] = function () {
                console.log('$controllerProvider', m, arguments);
                return _m.apply($controllerProvider, arguments);
            };
        });

    });

这样您就可以获得自己的列表。但它被称为覆盖框架,你不应该这样做。