2016-06-03 36 views
5

Voglio rendere direttiva l'apertura di un modal. Ma $ uibModal non è definito all'interno della direttiva.

var app=angular.module("app",['ui.bootstrap']); 

app.controller('AppCtrl', function ($scope, $uibModal) { 
    console.log("$uibModal controller",$uibModal);//getting object 
}); 

app.directive('showPopUp',function() { 
    return { 
     restrict: 'EA', 
     link: function(scope, el, attrs,$uibModal) { 
      console.log("$uibModal",$uibModal);//undefined here 
       var modalInstance = $uibModal.open({ 
        animation: $scope.animationsEnabled, 
        templateUrl: 'popup.html', 
       }); 

       modalInstance.result.then(function (selectedItem) { 
        scope.selected = selectedItem; 
       }, function() { 
       }); 

     } 
    } 
}); 

Come posso utilizzare $ uibModal nella mia direttiva per aprire modale?

+0

Penso che è possibile aggiungere controller al direttiva e iniettare $ uibModal lì. Funzionerà bene –

risposta

3

La funzione di collegamento della direttiva non è iniettabile, richiede un set fisso di parametri in ordine fisso. Ma si può iniettare servizi in funzione direttiva stessa:

app.directive('showPopUp', function($uibModal) { 
    return { 
     restrict: 'EA', 
     link: function(scope, el, attrs) { 

      var modalInstance = $uibModal.open({ 
       animation: scope.animationsEnabled, 
       templateUrl: 'popup.html', 
      }); 

      modalInstance.result.then(function(selectedItem) { 
       scope.selected = selectedItem; 
      }, function() {}); 

     } 
    } 
}); 

Demo:http://plnkr.co/edit/jwNOM94DtyRIXTdhvJmy?p=preview

+0

Dopo aver iniettato i servizi nella funzione direttiva, il codice viene eseguito continuamente e il browser si blocca. – Keshav

+0

Questo non è possibile con il codice che ho postato. Significa che hai incasinato qualcosa nella tua app. Ho postato una demo in risposta. – dfsq