switch bootstrap angularjs angular-ui-bootstrap bootstrap-modal

angularjs - bootstrap - ng-if



Cree una confirmación de Bootstrap Sí/No simple o solo una alerta de notificación en AngularJS (5)

Es tan simple en un entorno no angular. Solo html y una línea de código js para mostrar un cuadro de diálogo de confirmación modal en la pantalla.

Ahora estoy desarrollando un proyecto AngularJS en el que estoy usando diálogos de confirmación modal ui-bootstrap por todas partes y estoy cansado de crear nuevos controladores incluso para cosas simples como "¿Estás seguro de borrar este registro?" tipo de cosas.

¿Cómo manejas estas situaciones simples? Estoy seguro de que algunas personas escribieron algunas directivas para simplificar las necesidades.

Te pido que compartas tus experiencias o los proyectos que conoces sobre ese tema.


Para cualquier cosa que tenga código que se active con un ng-clic, simplemente agrego un atributo de confirmación

p.ej

<a confirm="Are you sure?" ng-click="..."></a>

y confirmar proviene de (no mío, encontrado en la web)

app.controller(''ConfirmModalController'', function($scope, $modalInstance, data) { $scope.data = angular.copy(data); $scope.ok = function() { $modalInstance.close(); }; $scope.cancel = function() { $modalInstance.dismiss(''cancel''); }; }).value(''$confirmModalDefaults'', { template: ''<div class="modal-header"><h3 class="modal-title">Confirm</h3></div><div class="modal-body">{{data.text}}</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>'', controller: ''ConfirmModalController'' }).factory(''$confirm'', function($modal, $confirmModalDefaults) { return function(data, settings) { settings = angular.extend($confirmModalDefaults, (settings || {})); data = data || {}; if (''templateUrl'' in settings && ''template'' in settings) { delete settings.template; } settings.resolve = { data: function() { return data; } }; return $modal.open(settings).result; }; }) .directive(''confirm'', function($confirm) { return { priority: 1, restrict: ''A'', scope: { confirmIf: "=", ngClick: ''&'', confirm: ''@'' }, link: function(scope, element, attrs) { function reBind(func) { element.unbind("click").bind("click", function() { func(); }); } function bindConfirm() { $confirm({ text: scope.confirm }).then(scope.ngClick); } if (''confirmIf'' in attrs) { scope.$watch(''confirmIf'', function(newVal) { if (newVal) { reBind(bindConfirm); } else { reBind(function() { scope.$apply(scope.ngClick); }); } }); } else { reBind(bindConfirm); } } } })

Mi Google FOO me ha fallado y no puedo encontrar el sitio de origen para esto. Actualizaré si lo encuentro.


Puede crear una fábrica simple como esta

angular.module(''app'') .factory(''modalService'', [ ''$modal'', function ($modal) { var self = this; var modalInstance = null; self.open = function (scope, path) { modalInstance = $modal.open({ templateUrl: path, scope: scope }); }; self.close = function () { modalInstance.dismiss(''close''); }; return self; } ]);

En tu controlador

angular.module(''app'').controller(''yourController'', [''$scope'',''modalService'',function($scope,modalService){ $scope.openModal=function(){ modalService.open($scope,''modal template path goes here''); }; $scope.closeModal=function(){ modalService.close(); //do something on modal close }; }]);

He pasado $scope en la función de servicio para que pueda acceder a la función de CloseModal y en caso de que quiera acceder a algunos datos de su controlador. En tu html

<button ng-click="openModal()">Open Modal</button>


Puede usar la biblioteca de confirmación angular .

Cuando se incluye, está disponible como directiva:

<button type="button" ng-click="delete()" confirm="Are you sure?">Delete</button>

Además de un servicio:

angular.module(''MyApp'') .controller(''MyController'', function($scope, $confirm) { $scope.delete = function() { $confirm({text: ''Are you sure you want to delete?'', title: ''Delete it'', ok: ''Yes'', cancel: ''No''}) .then(function() { // send delete request... }); }; });


Puedes ver mi ejemplo. lo que sea que haya hecho

<div ng-app="myApp" ng-controller="firstCtrl"> <button ng-click="delete(1);">Delete </button> </div>

guión

var app = angular.module("myApp", []); app.controller(''firstCtrl'', [''$scope'',''$window'', function($scope,$window) { $scope.delete = function(id) { deleteUser = $window.confirm(''Are you sure you want to delete the Ad?''); if(deleteUser){ //Your action will goes here alert(''Yes i want to delete''); } }; }])


así que crea un servicio reutilizable para eso ... lee aquí

código aquí:

angular.module(''yourModuleName'').service(''modalService'', [''$modal'', // NB: For Angular-bootstrap 0.14.0 or later, use $uibModal above instead of $modal function ($modal) { var modalDefaults = { backdrop: true, keyboard: true, modalFade: true, templateUrl: ''/app/partials/modal.html'' }; var modalOptions = { closeButtonText: ''Close'', actionButtonText: ''OK'', headerText: ''Proceed?'', bodyText: ''Perform this action?'' }; this.showModal = function (customModalDefaults, customModalOptions) { if (!customModalDefaults) customModalDefaults = {}; customModalDefaults.backdrop = ''static''; return this.show(customModalDefaults, customModalOptions); }; this.show = function (customModalDefaults, customModalOptions) { //Create temp objects to work with since we''re in a singleton service var tempModalDefaults = {}; var tempModalOptions = {}; //Map angular-ui modal custom defaults to modal defaults defined in service angular.extend(tempModalDefaults, modalDefaults, customModalDefaults); //Map modal.html $scope custom properties to defaults defined in service angular.extend(tempModalOptions, modalOptions, customModalOptions); if (!tempModalDefaults.controller) { tempModalDefaults.controller = function ($scope, $modalInstance) { $scope.modalOptions = tempModalOptions; $scope.modalOptions.ok = function (result) { $modalInstance.close(result); }; $scope.modalOptions.close = function (result) { $modalInstance.dismiss(''cancel''); }; }; } return $modal.open(tempModalDefaults).result; }; }]);

html para mostrar

<div class="modal-header"> <h3>{{modalOptions.headerText}}</h3> </div> <div class="modal-body"> <p>{{modalOptions.bodyText}}</p> </div> <div class="modal-footer"> <button type="button" class="btn" data-ng-click="modalOptions.close()">{{modalOptions.closeButtonText}}</button> <button class="btn btn-primary" data-ng-click="modalOptions.ok();">{{modalOptions.actionButtonText}}</button> </div>

una vez hecho esto ... solo tiene que inyectar el servicio anterior donde desee crear un cuadro de diálogo, ejemplo a continuación

$scope.deleteCustomer = function () { var custName = $scope.customer.firstName + '' '' + $scope.customer.lastName; var modalOptions = { closeButtonText: ''Cancel'', actionButtonText: ''Delete Customer'', headerText: ''Delete '' + custName + ''?'', bodyText: ''Are you sure you want to delete this customer?'' }; modalService.showModal({}, modalOptions) .then(function (result) { //your-custom-logic }); }