2014-06-06 18 views
5

Può una direttiva richiedere se stessa? Ecco un example:Può una direttiva angularjs richiedere se stessa?

app.directive('menu', function() { 
    return { 
    restrict: 'E', 
    require: '?^menu', 
    link: function(scope, element, attrs, ctrl) { 
     console.log('ctrl: ', ctrl); 

     if (ctrl) { 
     element.addClass('nested'); 
     } else { 
     element.addClass('notnested'); 
     } 
    } 
    }; 
}); 

Nella mia prova non sembra funzionare (ctrl è sempre indefinita). Vedere le plunk


BTW, dopo questa domanda è stato risposto ho scoperto che in questo caso il cursore (^) non ha alcun effetto e il controller passato alla funzione di collegamento è sempre proprio controllore dell'istanza. [plunk]

+0

So quello che sta cercando di fare. L'ho provato, ma non aiuta ... – gkalpak

+0

Non è che il cursore non abbia effetto, è che una singola istruzione 'require' include l'elemento stesso nella ricerca del controller a cui si fa riferimento. Vedi la mia risposta qui sotto per un plunker. – jbmilgrom

+0

nice, ho upvoted la tua risposta –

risposta

5

È necessario definire direttamente la funzione di regolatore per esporre direttiva API per altre direttive:

app.directive('menu', function() { 
    return { 
    restrict: 'E', 
    require: '?^menu', 
    controller: function($scope){ }, 
    link: function(scope, element, attrs, ctrl) { 
     console.log('ctrl: ', ctrl); 

     if (ctrl) { 
     element.addClass('nested'); 
     } else { 
     element.addClass('notnested'); 
     } 
    } 
    }; 
}); 

Vedi http://plnkr.co/edit/cKFuS1lET56VOOYD5rrd?p=preview

+0

doh. ovviamente! –

1

immagino qui il problema non è con la direttiva stessa fa riferimento. La direttiva non saprà a quale controller fare riferimento fino a quando non verrà specificato o definito. Per accedere a un controller deve essere definito o indicato nella direttiva come di seguito.

app.directive('menu', function() { 
    return { 
    restrict: 'E', 
    controller: 'MainCtrl', 
    require: ['?^menu'], 
    link: function(scope, element, attrs, ctrl) { 
     console.log('ctrl: ', ctrl[0]); 
     if (ctrl) { 
     element.addClass('nested'); 
     } else { 
     element.addClass('notnested'); 
     } 
    } 
    }; 
}); 
2

Con angolare 1.4x, in realtà si può ora limitare la dichiarazione require a elementi padresolo ed escludere l'elemento stesso. Se si cambia require: '?^menu'-require: '?^^menu' (notare il secondo accento circonflesso) in modo da ottenere

app.directive('menu', function() { 
    return { 
    restrict: 'E', 
    require: '?^^menu', 
    controller: function($scope){ }, 
    link: function(scope, element, attrs, ctrl) { 
     console.log('ctrl: ', ctrl); 

     if (ctrl) { 
     element.addClass('nested'); 
     } else { 
     element.addClass('notnested'); 
     } 
    } 
    }; 
}); 

il codice ora funziona come previsto.

Vedi http://plnkr.co/edit/2uDUO0LcgDX7xEuBtsJ2?p=preview

Problemi correlati