angularjs - 如何动态实例化服务?

标签 angularjs dependency-injection angular-services objectinstantiation

我有一个 Utils服务很重。我想在特定的用户操作上使用其中定义的一些功能。由于这项服务很重,我想懒惰地实例化它(根据用户操作)。

我如何实现这一目标?

服务

module.service('Utils', function (dep1, dep2) {
   this.method1 = function () {
      // do something
   }
   // other methods
});

Controller
module.controller('AppCtrl', function ($scope) {
    // I don't want to inject Utils as a dependency.

    $scope.processUserAction = function () {
       // If the service is not instantiated 
       // instantiate it and trigger the methods defined in it. 
    }
});

标记
<div data-ng-controller="AppCtrl">
    <button data-ng-click="processUserAction()"> Click Me </button>
</div>

最佳答案

您可以使用 $injector 服务在任何地方获取服务:https://docs.angularjs.org/api/auto/service/$injector .将 $injector 注入(inject)您的 Controller ,并在您需要服务时使用:

这对我来说很好,服务仅在 $injector 调用上实例化,没有抛出错误。

 angular.module('yp.admin')

    .config(['$stateProvider', '$urlRouterProvider', 'accessLevels', '$translateWtiPartialLoaderProvider',
        function ($stateProvider, $urlRouterProvider, accessLevels, $translateWtiPartialLoaderProvider) {
            $stateProvider
                .state('admin.home', {
                    url: "/home",
                    access: accessLevels.admin,
                    views: {
                        content: {
                            templateUrl: 'admin/home/home.html',
                            controller: 'AdminHomeController'
                        }
                    }
                });
        }])
    .service('UtilsService', function() {
        console.log('utilsSerivce instantiated');
        return {
            call: function() {
                console.log('Util.call called');
            }
        };
    })

    .controller('AdminHomeController', ['$scope', '$rootScope', 'UserService', '$injector',
        function($scope, $rootScope, UserService, $injector) {
        $injector.get('UtilsService').call();
    }]);    

控制台给了我这个:
stateChangeStart from:  to: admin.home
stateChangeSuccess from:  to: admin.home
utilsSerivce instantiated
Util.call called

如果你想延迟加载 JS,你应该看看 ocLazyLoad模块:https://github.com/ocombe/ocLazyLoad .它解决了各种延迟加载用例,你的听起来很适合它。

关于angularjs - 如何动态实例化服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29319023/

相关文章:

javascript - 如何在 angular-ui-switch 中获取 ng-change 事件?

java - 为什么 Spring 的 @Configurable 有时有效,有时无效?

javascript - 从另一页面中的一项服务的回调函数获取结果

angular - 在我的情况下,如何将服务注入(inject)模块?

javascript - 如何从 Web url 加载元数据,类似于我们在状态更新上发布 url 时 facebook 所做的事情...?

javascript - 在 Angular 中进行异步 ajax 调用

javascript - $compile 动态添加行以使用 ngClick - AngularJS

asp.net - 依赖注入(inject)陷阱

java - 通过 Spring 注入(inject)空 map

javascript - 无法从自定义服务返回对 AngularJS 范围的引用