Правильный способ введения зависимостей контроллера 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