2

angular.injector を手動で使用して、ダイアログを開いているサービスを挿入しようとすると、問題が発生します。これは、動的テンプレートを使用するディレクティブをテンプレート内で使用します。

コンソールに表示されるエラーは次のとおりです。

1: 不明なプロバイダー: $rootElementProvider <- $rootElement <- $location <- $anchorScroll <- ngIncludeDirective <- $location

2: ディレクティブ 'ngInclude' で必要なコントローラー 'ngInclude' が見つかりません!

これが問題を示すプランカーです

var customSvc = angular.injector(['ng', 'pluginApp']).get("customSvc");
customSvc.testOpenDialog(100, scope);

また、url を作成してディレクティブ属性として指定し、templateUrl 関数からアクセスしようとしましたが、この場合も失敗します。受け取った値は変数の名前であり、内容ではありません。

angular.injector を介したサービスの注入を回避すると、コードは機能しますが、アプリケーションの性質上、回避することはできません。また、このエラーの背後にある理由を理解することに興味があります。問題に光を当てるのに十分親切です。

4

2 に答える 2

2

解決策は、次の方法でサービスを注入することです。

   var customSvc = angular.injector(['ng', 'pluginApp', 
      function($provide) {
        var $rootElement = angular.element(document.querySelector('body'));
        $provide.value('$rootElement', $rootElement);
      }]).get("customSvc");

これが作業中のプランカーです

于 2016-09-26T08:55:48.310 に答える
0

gedContextMenu.jsファイルで、次の変更を行います

注入するpluginApp

angular.module('gedContextMenuApp', ['ui.bootstrap', 'mgcrea.ngStrap.popover','pluginApp']);

メニュー ディレクティブにサービスを挿入customSvcします。gedContextMenu

angular.module('gedContextMenuApp').directive('gedContextMenu',['$log','$templateCache', '$uibModal', 'customSvc', function($log, $templateCache, $uibModal, customSvc) {
  return {
    restrict: 'AE',
    scope: {
      gedContextData: '='
    },
    template: "<button class='fa fa-cog' bs-popover data-template='{{popoverTemplate}}' data-auto-close='1' data-placement='bottom' data-animation='am-flip-x'></button>",
    controller: function($scope) {
      $scope.popoverTemplate = 'popoverTemplate.html';

      $scope.executePlugin = function($event, contextItem) {
        var propName = contextItem.action;
        $scope.contextItem = contextItem;
        $log.info('property name ' + propName + ' used to trigger event ', $event.type);
        $scope[propName] = $event;
      }

      $scope.click = function($event, contextItem) {
        $scope.executePlugin($event, contextItem);
      }
    },
    link: function(scope, element, attrs) {
        scope.$watch('openDialog', function(event) {
        if (event && event.type === 'click') {
          console.log(customSvc);
          // var customSvc = angular.injector(['ng', 'pluginApp']).get("customSvc");

          //angular.injector(['ng', function($provide) {
          //  var $rootElement = angular.element(document.querySelector('body'));
          //  $provide.value('$rootElement', $rootElement);
          //}]).invoke(function($injector) {
          //  var localRootElement = $injector.get('$rootElement');
          //});

          // customSvc.testOpenDialog(100, scope);
          //customSvc.testDirettivaConfirm(100, scope);

        }
      });
    }
  }
}]);
于 2016-09-26T06:32:12.030 に答える