2016-01-24 1 views
7

Quando inserisco $ state/$ stateParams nella direttiva non sono disponibili all'interno della funzione univoca, perché?

'use strict'; 
angular.module('TGB').directive('uniqueSchoolclassnumberValidator', function (schoolclassCodeService) { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function (scope, element, attrs, ngModel) { 
      ngModel.$asyncValidators.unique = function (schoolclassNumer) { 

       var schoolyearId = 1; // Read schoolyearId from the $stateParams.id but how to inject? 
       return schoolclassCodeService.exists(schoolyearId, schoolclassNumber); 
      }; 
     } 
    }; 
}); 

UPDATE

enter image description here

Come si vede nei miei Google Chrome console $ stateParams o stato $ sono non definito!

+0

nessun motivo per cui non dovrebbero essere. Dov'è il codice che non funziona? Cosa significa "non disponibile"? Fornire anche una demo che riproduce il problema – charlietfl

+0

Vedere il mio aggiornamento con screenshot. – HelloWorld

+0

non si è ancora sicuri di dove si provi a usarli ... all'interno di 'schoolclassCodeService.exists()'? Se è così, devono essere iniettati lì o passati come argomento – charlietfl

risposta

7

Avrete bisogno di un Controller definito come parte della vostra direttiva in cui $stateParams può essere iniettato. Qualcosa in questo senso dovrebbe funzionare (non testato)

(function(){ 
angular 
    .module('TGB') 
    .directive('uniqueSchoolclassnumberValidator', schoolclassDirective); 

    schoolclassDirective.$inject = ['$state', '$stateParams', '$compile','schoolclassCodeService']; 

    function schoolclassDirective($state, $stateParams, $compile,schoolclassCodeService) { 
    var directive = { 
     restrict: 'A', 
     require: 'ngModel', 
     controller : MyController 
     link: function (scope, element, attrs, listOfCtrls) { 
     // you will need to get the ngModelCtrl from the list of controllers as you have the require field set above 
      var ngModelCtrl = listOfCtrls[0]//[1]; 
      var myCtrl = listOfCtrls[1]//[0]; 
      ngModelCtrl.$asyncValidators.unique = function (schoolclassNumer) { 

      var schoolyearId = myCtrl.id; 
      return schoolclassCodeService.exists(schoolyearId, schoolclassNumber); 
      }; 
     }; 
    }; 


    function MyController($state, $stateParams){ 
     var scope = this; 
    scope.id= $stateParams.schoolyearId; 
    } 

    return directive; 
}} 

Inoltre si prega di passare attraverso l'utilizzo di $stateParams dal wiki

L'altro modo per ottenere il 1 che se fa parte di uno stato genitore sarebbe quello di definire function of the parent state e utilizzarlo all'interno del controller.