Правильный способ введения зависимостей контроллера angular внутри angular.ui modal

после angular.ui Modal пример показывает modalInstance вызов ModalIntanceCtrl, который позже создается как функция:

var ModalDemoCtrl = function ($scope, $modal, $log) {

  $scope.items = ['item1', 'item2', 'item3'];

  $scope.open = function () {

    var modalInstance = $modal.open({
      templateUrl: 'myModalContent.html',
      controller: ModalInstanceCtrl,
      resolve: {
        items: function () {
          return $scope.items;
        }
      }
    });

    modalInstance.result.then(function (selectedItem) {
      $scope.selected = selectedItem;
    }, function () {
      $log.info('Modal dismissed at: ' + new Date());
    });
  };
};

var ModalInstanceCtrl = function ($scope, $modalInstance, items) {

  $scope.items = items;
  $scope.selected = {
    item: $scope.items[0]
  };

  $scope.ok = function () {
    $modalInstance.close($scope.selected.item);
  };

  $scope.cancel = function () {
    $modalInstance.dismiss('cancel');
  };
};

У меня есть 2 вопроса/проблемы:

  • Документы рекомендуют создать контроллер по-другому (из-за проблем с минимизацией), например:

    myApp.controller('GreetingCtrl', ['$scope', function($scope) { $scope.greeting = 'Hola!'; }]);

Но если я создаю контроллер, как это, как я могу вложить его в modalInstance?

  • Контроллер, который я называю здесь, не является контроллером Modal Instance, но мой глобальный loginCtrl, это проблема? должен ли я как-то подклассифицировать loginCtrl или вызвать его из ModalInstanceCtrl? и если да - как именно?

Буду рад за руководство и разъяснение об этом. Спасибо!

Ответ 1

Вопрос не очень ясен, но если вы объявляете контроллер с помощью API-модуля модуля, то вы можете предоставить контроллеру модальную службу в виде строки

myApp.controller('ModalInstanceCtrl', ['$scope', function($scope) { $scope.greeting = 'Hola!'; }]);

controller: 'ModalInstanceCtrl',

То же самое можно сделать для loginCtrl, если вы хотите использовать это в модальной службе.

Ответ 2

Я создал этот plunker для тех, кто из вас, как я, которые любят видеть пример. В нем показано, как создать модальное значение, не загрязняя глобальное пространство имен. Надеюсь, это поможет.

Отредактировано, чтобы включить пример кода в соответствии с bummi ниже

index.html

<html ng-app="app">
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular.js"></script>
    <script src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.10.0.js">    </script>
<script src="app.js"></script>
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css"     rel="stylesheet">
  </head>
  <body>

<div ng-controller="appController">
    <script type="text/ng-template" id="myModalContent.html">
    <div class="modal-header">
        <h3>I'm a modal!</h3>
    </div>
    <div class="modal-body">
        <span>Message:{{message}}</span>
        <ul>
            <li ng-repeat="item in items">
                <a ng-click="selected.item = item">{{ item }}</a>
            </li>
        </ul>
        Selected: <b>{{ selected.item }}</b>
    </div>
    <div class="modal-footer">
        <button class="btn btn-primary" ng-click="ok()">OK</button>
        <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
    </div>
</script>

<button class="btn btn-default" ng-click="showModal()">Open me!</button>
<div ng-show="selected">Selection from a modal: {{ selected }}</div>
</div>
  </body>
</html>

app.js

angular.module('app', ['ui.bootstrap']).
service('DataService', ['$rootScope',
  function($rootScope) {
    this.data = {};
    this.data.message = 'This is a message from a service';
    this.data.items = ['item1', 'item2', 'item3'];
  }
]).
controller('myModal', ['$scope', '$modalInstance', 'DataService',
  function($scope, $modalInstance, dataService) {
    $scope.data = dataService.data;
    $scope.message = dataService.data.message;
    $scope.items = dataService.data.items;

    $scope.selected = {
      item: $scope.items[0]
    };

    $scope.ok = function() {
      $modalInstance.close($scope.selected.item);
    };

    $scope.cancel = function() {
      $modalInstance.dismiss('cancel');
    };

  }
]).
controller('appController', ['$scope', '$modal', '$log', 'DataService',
  function($scope, $modal, $log, dataService) {

    $scope.data = dataService.data;

    $scope.showModal = function() {
      var modalInstance = $modal.open({
        templateUrl: 'myModalContent.html',
        controller: 'myModal'
      });

      modalInstance.result.then(function(selectedItem) {
        $scope.selected = selectedItem;
      }, function() {
        $log.info('Modal dismissed at: ' + new Date());
      });

    };

  }
]);

Ответ 3

Имел аналогичную проблему и объявил модальный контроллер, не добавляя его в модуль, например:

var ModalInstanceCtrl = ['$scope', '$modalInstance', 'items', function ($scope, $modalInstance, items) { ... }

Если никаких других изменений не требуется, этот синтаксис также работает с минимизацией.

Ответ 4

Простым способом для этого является использование $inject:

    // inject the controller with the following dependencies
    ModalInstanceCtrl.$inject = ['$scope', '$modalInstance', 'items'];

Измените метод контроллера на именованную функцию:

    function ModalInstanceCtrl($scope, $modalInstance, items) {
        $scope.items = items;
        $scope.selected = {
            item: $scope.items[0]
        };

        $scope.ok = function () {
            $modalInstance.close($scope.selected.item);
        };

        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    };

Я написал статью в блоге по этому вопросу и включает в себя, как писать тесты для директив, которые используют $inject:

transitioning-to-angular-2-0-part-2