2015-04-13 10 views
31

È così semplice in un ambiente non angolare. Solo html e due righe di codice js per mostrare una finestra di dialogo di conferma modale sullo schermo.Creare un semplice Bootstrap Sì/Nessuna conferma o solo un avviso di notifica in Angular

Ora sto sviluppando un progetto AngularJS in cui sto usando i dialoghi di conferma modali dell'interfaccia utente-bootstrap dappertutto e sono stufo di creare nuovi controller anche per cose semplici come "Sei sicuro di cancellare questo record?" tipo di roba.

Come gestite queste semplici situazioni? Sono sicuro che alcune persone hanno scritto alcune direttive per semplificare i bisogni.

Ti chiedo di condividere le tue esperienze o i progetti che conosci su quell'argomento.

+1

Questa implementazione potrebbe aiutare https://github.com/me-conroy/ angular-dialog-service – Chandermani

+0

@Chandermani sembra buono. Passando attraverso i documenti adesso, grazie! – ilter

+0

@Chandermani che l'implementazione richiede anche la creazione di un controller aggiuntivo che non risponda alle mie esigenze. – ilter

risposta

57

così creare un servizio riutilizzabile per questo ... read here codice

qui:

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 per la visualizzazione

<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 volta fatto questo ... non resta che inserire il servizio sopra il punto in cui si desidera creare una finestra di dialogo, esempio sotto

+0

Questo sembra un modo elegante di utilizzare i dialoghi a livello globale. Aspetterò altre risposte prima di accettare la tua risposta nel momento in cui darò una risposta. Grazie! – ilter

+0

Attualmente sto usando questo approccio nella mia domanda. Inoltre, apprezza il link per il post sul blog di Dan Wahlin. Segnando il tuo suggerimento come risposta. – ilter

+0

Come si può chiudere questa modal dal codice? Intendo automaticamente quando alcuni processi sono finiti. Il trigger sul pulsante di chiusura non funziona. Qualche idea? – RicardoGonzales

13

Puoi vedere il mio esempio. qualunque cosa abbia fatto.

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

sceneggiatura

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'); 
    } 
    }; 
}]) 
+5

Immagino che tu abbia perso la parte "Dialstrap Modal Dialogs" :) Grazie per la risposta, però ... – ilter

2

è possibile creare una semplice fabbrica di come questo

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; 
     } 
]); 

Nel vostro controller

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 
}; 
}]); 

Ho passato $scope in funzione di servizio in modo da può a ccess funzione closeModal e nel caso in cui si desideri accedere ad alcuni dati dal controller. nel codice HTML

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

Versione semplificata di ciò che @entre ha suggerito. Grazie per la risposta. – ilter

6

per tutto ciò che ha il codice che viene attivato con un ng-click Ho solo aggiungere un attributo conferma

esempio

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

e conferma viene dal (non mia, trovato sul 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); 
       } 
      } 
     } 
    }) 

Il mio Google FOO mi ha mancato e non riesco a trovare il sito di origine per questo. Aggiornerò se lo trovo.

+0

Semplice e comprensibile. Lo proveremo non appena avrò tempo. Grazie, @Steve Drake – ilter

+0

grazie, sono nuovo (ish) all'angolare e trovo che ci sono tanti modi per fare le cose, ho scelto questo perché mi piaceva il fatto che hai solo un attributo e di te, puoi ha anche un attributo confirmif che restituisce un bool. –

+0

Sembra che possa provenire da https://schlogen.github.io/angular-confirm/ – Chris

10

È possibile utilizzare la libreria Angular Confirm.

Quando incluso, è diventato disponibile come una direttiva:

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

Così come un servizio:

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... 
     }); 
    }; 
    }); 
+0

Grazie! Buono a sapersi :) – ilter

+0

Il link è rotto – walla

+0

Grazie @walla, corretto! –

Problemi correlati