9

Come accedere alle funzioni del controller di direttive dal collegamento direttiva? Il controller muggito passato al collegamento è vuoto, mi piacerebbe entrare in esso show() funzioni hide().Come accedere alle funzioni del controller nel collegamento direttivo?

Il mio attuale direttiva:

app.directive('showLoading', function() { 
    return { 
    restrict: 'A', 
    // require: 'ngModel', 
    scope: { 
     loading: '=showLoading' 
    }, 
    controller: function($scope, $element) { 
     return { 
     show: function() { 
      alert("show"); 
     }, 
     hide: function() { 
      alert("hide"); 
     } 
     }; 
    }, 
    link: function($scope, $element, $attrs, controller) { 
     $scope.$watch('loading', function(bool) { 
     if (bool) { 
      controller.show();//undefined 
     } else { 
      controller.hide(); 
     } 
     }); 
    } 
    }; 
}); 

risposta

30

Publishing sulla portata può funzionare, ma non la migliore pratica, dal momento che "inquina" l'ambito. Il modo corretto di comunicare con il proprio controller è require - quindi diventerà disponibile come parametro per la funzione link, insieme ad altre direttive richieste.

L'altro problema riguarda il modo in cui si espongono le funzioni sul controller, utilizzando this.someFn, non restituendo un oggetto.

app.directive('showLoading', function() { 
    return { 
    restrict: 'A', 
    require: ['ngModel', 'showLoading'], // multiple "requires" for illustration 
    scope: { 
     loading: '=showLoading' 
    }, 
    controller: function($scope, $element) { 
     this.show = function() { 
     alert("show"); 
     }; 

     this.hide = function() { 
     alert("hide"); 
     }; 
    }, 
    link: function($scope, $element, $attrs, ctrls) { 
     var ngModel = ctrls[0], me = ctrls[1]; 

     $scope.$watch('loading', function(bool) { 
     if (bool) { 
      me.show(); 
     } else { 
      me.hide(); 
     } 
     }); 
    } 
    }; 
}); 
+0

Grazie per aver descritto come accedere al controller di istruzioni quando si ha un controller aggiuntivo richiesto. –

-2

Hai qualche tipo di problema all'interno della funzione di controllo

Ecco il codice funzionando benissimo

app.directive('showLoading', function() { 
    return { 
    restrict: 'AE', 
    // require: 'ngModel', 
    scope: { 
     loading: '=showLoading' 
    }, 
    controller: function($scope, $element) { 
     $scope.show = function() { 
      alert("show"); 
     }, 
     $scope.hide = function() { 
      alert("hide"); 
     } 
    }, 
    link: function($scope, $element, $attrs) { 
     $scope.$watch('loading', function(bool) { 
     if (bool) { 
      $scope.show();//undefined 
     } else { 
      $scope.hide(); 
     } 
     }); 
    } 
    }; 
}); 
+1

Davvero un peccato che questa risposta è stata contrassegnata come una soluzione. La [risposta] (http://stackoverflow.com/a/29195873/5788429) pubblicata da "New Dev" è in realtà molto meglio. – Anton