Come verificare se un argomento di metodo di una direttiva è specificato in AngularJS?

Ho creato una direttiva personalizzata che contiene un pulsante. Questo pulsante chiama un metodo dall’ambito genitore specificato dall’attributo ‘callback’.

   Simple directive   var app = angular.module('app', []); app.controller('TestController', function($scope) { $scope.doSomething = function(param) { alert('Something called with: ' + param); } }) app.directive('myDirective', function() { var ret = { restrict: 'E', scope: { user: '@', callback: '&' // bound a function from the scope }, template: '
Hello {{user}}', controller: function($scope) { $scope.hasCallback2 = function() { var t = typeof $scope.callback; return t == 'function'; } $scope.hasCallback = function() { return angular.isDefined($scope.callback); } } }; return ret; });

La mia domanda è:

Come posso controllare la visibilità del pulsante all’interno del modello? Mi piacerebbe nasconderlo se l’attributo callback non è specificato nel tag personalizzato (vedi 3 ° tag my-directive). Quando controllo il tipo di callback, ottengo sempre ‘function’ e angular.isDefined (…) restituisce anche true.

Usare ‘&?’ restituisce undefined se l’attributo non è stato impostato.

‘&’ = la funzione di callback è sempre definita.

‘&’ = la funzione callback è definita solo quando l’attributo è definito nel template html.

 bindToController: { callback: '&?' }, controller: function() { if (this.callback === undefined) { // attribute "callback" was not defined } } 

Nota: funziona in Angular 1.4.8. Non sono sicuro che funzioni nelle versioni precedenti.

Guardando il codice sorgente di angularjs, vedo questo:

 case '&': parentGet = $parse(attrs[attrName]); isolateScope[scopeName] = function(locals) { return parentGet(scope, locals); }; break; 

parentGet è l’espressione della funzione associata. Sfortunatamente, questa è una variabile locale che è disponibile solo per la funzione assegnata a isolateScope[scopeName] tramite chiusura.

Invece di provare a trovare un modo per ottenere quella variabile, una soluzione semplice è solo per controllare gli attrs . Provare:

 link: function(scope,elem,attrs) { scope.hasCallback = function() { return angular.isDefined(attrs.callback); } } 

DEMO