Angular -ui bootstrap modal без создания нового контроллера
plunk: http://plnkr.co/edit/85Wl5W Если я использую $modalInstance на том же контроллере (modalController.js), не будучи в модальном, angular становится замороженным.
Я просто хочу упростить свою жизнь с помощью angularjs с помощью модальной службы angular -ui bootstrap. Я хочу использовать один и тот же контроллер в отдельном файле, но также и для модального. То есть, я хочу, чтобы они выполняли ту же задачу. Есть ли правильный способ сделать это?
например. modal.html, modalController.js. Я хочу показать их в модальном окне, но и в моем приложении, без модального. Проблема в том, что если я использую тот же контроллер, я не могу ввести $modalInstance, так как он undefined, если нет модального.
Спасибо заранее,
Алекс
Ответы
Ответ 1
Я еще не нашел чистого решения, лучшего решения, которое я нашел, чтобы избежать написания того же кода дважды, было расширение модального контроллера следующим образом:
$.extend(this, $controller('NormalCtrl', {$scope: $scope}));
полный контроллер:
.controller('ModalCtrl', ['$scope', '$controller', '$modalInstance',
function ($scope, $controller, $modalInstance) {
//with this line here:
// Initialize the super class and extend it.
$.extend(this, $controller('NormalCtrl', {$scope: $scope}));
// Opens a search result
$scope.openResult = function() {
$modalInstance.close($scope.selectedRow);
};
// Called when the cancel button is pressed
$scope.back = function() {
$modalInstance.dismiss('cancel');
};
}]);
Таким образом, я могу повторно использовать один и тот же код, не переписывая его снова и снова, и я могу переопределить функции, которые я хочу сделать с другим, отличным от исходного контроллера.
Надеюсь, я помог некоторым людям там,
Алекс
Ответ 2
Это было возможно в более старой версии UI-Bootstrap 0.10.0. Даже последняя версия, она работает для меня
index.html
<!-- if you are using Bower -->
<script src="bower_components/angular-bootstrap/ui-bootstrap.min.js">
</script>
<script src="bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js">
</script>
<!-- modal -->
<!-- look at 'type' and 'id' values -->
<script type="text/ng-template" id="myTestModal.tmpl.html">
<div class="modal-header">
<h3>Modal Header</h3>
</div>
<div class="modal-body">
<p>Modal Body</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" ng-click="close()" data-dismiss="modal">Close
</button>
<button type="button" class="btn btn-primary" ng-click="doSomething()">Do Something
</button>
</div>
</script>
modalDemoController.js
$scope.openModal=function(){
$scope.modalInstance=$modal.open({
templateUrl: 'myTestModal.tmpl.html',
scope:$scope
});
}
$scope.close=function(){
$scope.modalInstance.dismiss();//$scope.modalInstance.close() also works I think
};
$scope.doSomething=function(){
//any actions to take place
console.log("Do Something");
}
Ответ 3
Просто напишите функцию вместо создания нового файла:
$scope.yourModal= function (data) {
var modalInstance = $modal.open({
template: '<div>Do you really want to hurt me? <div><button class="btn" ng-click="hurt(data)">Yes</button></div></div>',
controller: function($scope, scope){
$scope = scope;
},
resolve: {
scope: function () {
return $scope;
}
},
size: 'sm'
});
}
$scope.hurt = function(data){
console.log(data);
}