4

Utilsは非常に重いサービスを持っています。特定のユーザー アクションで定義されている関数の一部を使用したい。このサービスは重いので、(ユーザーの操作で)遅延してインスタンス化したいと思います。

どうすればこれを達成できますか?

サービス

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

コントローラ

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>
4

1 に答える 1

5

$injector サービスを使用して、どこでもサービスを取得できます: https://docs.angularjs.org/api/auto/service/$injector。$injector をコントローラーに注入し、サービスが必要なときはいつでも次を使用します。

これは私にとってはうまくいきました。サービスは $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 ) を確認する必要があります。あらゆる種類の遅延読み込みのユースケースに対応しており、あなたのケースはそれに適しているように思えます。

于 2015-03-28T16:02:17.030 に答える