2012-12-26 13 views
6

Fondamentalmente, come posso ascoltare i cambiamenti in un'espressione all'interno di una direttiva?Osservare un'espressione dall'interno di una direttiva


Sto utilizzando la non documentata ng-required richiedere condizionalmente un certo campo:

<input type="checkbox" ng-model="partner" checked /> 
<input ng-model="partnerName" placeholder="required" ng-required="partner" /> 

Questa grande opera (here's the Plunkr). L'unico problema è che mantiene il testo "richiesto" placeholder, indipendentemente dal fatto che sia effettivamente necessario.


Così, ho deciso di creare la mia direttiva. Ecco come dovrebbe funzionare:

<input ng-placeholder="{ 'required': partner }" /> 

L'idea è simile a quella di angolare ng-class, ma non ho modo per ottenere questo risultato. Ecco quello che ho finora:

app.directive('ngPlaceholder', function ($parse) { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      console.log(scope.$eval(attrs.ngPlaceholder)); 
     } 
    } 
}); 

che registra un oggetto bello che posso usare per determinare il valore placeholder:

{ required: true } 

ma come faccio poi agganciare nel ciclo $digest/$apply aggiornare l'attributo placeholder ogni volta che cambia partner?

risposta

2

È questo quello che vuoi? plunker

l'idea di base per la funzione di collegamento dovrebbe essere come

link: function (scope, element, attrs) { 
     scope.$watch(attrs.xngPlaceholder, function (newVal, oldVal, scope) { 
      element.removeAttr('placeholder'); 
      var att = ''; 
      angular.forEach(newVal, function (elm, key) 
       att += elm ? (key + ' ') : ''; 
      }); 
      element.attr('placeholder', att); 
     }, true); 
    } 
+2

Un suggerimento: non usare prefisso ng poiché è un angolars, a meno che non si sappia che in una versione futura implementeranno ng-placeholder con la stessa sintassi –

+0

Grazie! È vero. Comunque uso solo il codice del post originale. – maxisam

0

Un approccio alternativo, che non richiede una direttiva:

placeholder="{{{true: 'required', false:''}[partner]}}" 

È possibile che questo crea oggetto {true: 'required', false:''} e poi gli indici in oggetto utilizzando il valore corrente di partner.

Problemi correlati