2015-06-22 23 views
9

Non riesco a passare il valore booleano alla mia direttiva.AngularJS: passaggio valore booleano alla direttiva

Ecco il mio HTML:

<city-zip city="clientCity" zip="clientZip" requiredParam="'true'"></city-zip> 

e la direttiva:

.directive('cityZip', function() { 
    return { 
     restrict: 'E', 
     templateUrl: '../templates/templateCityZip.html', 
     scope: { 
      city: '=', 
      zip: '=' 
     }, 
     controller: function($scope) {} 
    } 
}); 

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Basta creare una variabile di ambito per verificarlo. Non è necessario passare come stringa. Dovresti passare come variabile – Fals

risposta

11

HTML

<city-zip city="clientCity" zip="clientZip" required-param="true"></city-zip> 
<city-zip city="clientCity" zip="clientZip" required-param="{{ someBooleanValue }}"></city-zip> 

angolare

.directive('cityZip', function() { 
    return { 
     restrict: 'E', 
     templateUrl: '../templates/templateCityZip.html', 
     scope: { 
      city: '=', 
      zip: '=', 
      requiredParam:'@' 
     }, 
     link: function(scope) { 
      console.log("requiredParam", scope.requiredParam); 
     } 
    } 
}) 
+1

Mi dispiace, questo restituisce undefined –

+1

controllare ora, modificato 'required-param =', era 'requiredParam =' –

+0

Ho cambiato questo. guarda il mio commento in basso su ng-required? –

7

All'interno link, è possibile accedere l'attributo:

return { 
    // code 
    link: link 
} 

function link(scope, $el, attrs) { 
    var requiredParam = attrs.requiredParam === 'true'; 
} 

Che verrà costringere il valore di stringa per un valore booleano (se il valore stringa è 'vero', che restituisca vero, altrimenti sarò return false.)

La parte principale qui è come convertire un valore di stringa "true" o "false" nella sua forma booleana, poiché !!'true' e !!'false' restituiscono entrambi true. Vedi this answer per la soluzione e discussione estesa.

Se è necessario utilizzare il valore nel controller, è possibile eseguire lo stesso modello nell'oggetto scope e passarlo nel modulo coercitato al controller accoppiato.

+0

@JBNizet, sì ho appena capito che, ho cambiato la mia risposta prima di commentare (ora dice 'var requiredParam == attrs.requiredParam === 'true''. –

+0

Grazie per la risposta. La mia direttiva non funziona, possibile perché link e controller allo stesso tempo? Puoi indicarmi come farlo nel controller? Non so nemmeno perché il collegamento è per. –

+1

@Zigson, vorrei suggerire di leggere i documenti di AngularJS per direttive, fornisce spiegazioni abbastanza buone su come usare il collegamento –

1

Ci sono 3 parametri che è possibile passare alla funzione di collegamento che funzionano sulla direttiva. I parametri sono scope, element e attributes.

  1. scope indica l'ambito del controller a cui è applicata la direttiva.

  2. element passa le informazioni relative all'elemento DOM su cui è applicato

  3. attributi passa le informazioni su tutti gli attributi dell'elemento DOM che sono sull'elemento.

    <city-zip ng-app="myapp" city="clientCity" zip="clientZip" required-param="true"></city-zip> 
    
    angular.module("myapp", []).directive('cityZip', function() { 
    return { 
        restrict: 'E', 
        templateUrl: '', 
        scope: { 
         requiredParam:'@' 
        }, 
        link: function(scope, $el, attrs) { 
         alert(attrs.requiredParam); 
        } 
    } 
    

    })

Lavorare jsFiddle

+0

Grazie per il vostro impegno. Divento vero o falso, ma in qualche modo penso che questo non sia veramente booleano. Sto usando ng-required = "requiredParam" nel mio modello di direttiva: ottengo errori di convalida anche se ng-required è impostato su true. –

+0

Questo sta funzionando, ho dimenticato di associare requiredParam (metterli tra parentesi graffe). –

4

Penso che la risposta più semplice/pulito non è ancora stato incluso per questa domanda. Questa risposta si inserisce anche all'interno della HTML5 Spec per un attributo booleano - attribuisce http://www.w3.org/TR/html5/infrastructure.html#boolean-attributes

2.5.2 booleano

una serie di attributi sono attributi booleani.La presenza di un attributo booleano su un elemento rappresenta il valore vero e l'assenza dello attributo rappresenta il valore falso.

Se l'attributo è presente, il suo valore deve essere o la stringa vuota o un valore che è una corrispondenza case-insensitive ASCII per nome canonico dell'attributo , senza spazi iniziali o finali.

I valori "true" e "false" non sono consentiti sugli attributi booleani. Per rappresenta un valore falso, l'attributo deve essere omesso del tutto.

HTML:

<city-zip city="clientCity" zip="clientZip" requiredParam></city-zip> 

e la direttiva:

.directive('cityZip', function() { 
    return { 
     restrict: 'E', 
     templateUrl: '../templates/templateCityZip.html', 
     scope: { 
      city: '=', 
      zip: '=' 
     }, 
     controller: function($scope, $attrs) { 
      $scope.requiredParamExists = $attrs.hasOwnProperty('requiredParam'); 
     } 
    } 
}); 

Semplice, si adatta in modo pulito con HTML5 spec per gli attributi booleani, e non c'è bisogno di forzare una stringa ad una variabile ambito ('requiredParam': '=').

Nota nel codice di esempio sopra riportato, se minified, le variabili richieste $scope e $attrs cambieranno in una stringa più breve e interromperanno il codice, ma questo è un altro problema.

+0

Il grosso problema con questa implementazione è se si desidera utilizzare un componente con questo tipo di modello di attributo all'interno del proprio componente e, allo stesso tempo, includere o meno in modo dinamico tale attributo. Ad esempio, se si desidera disattivare o attivare l'attributo "multiple" di ui-select in modo dinamico senza ripetere l'elemento HTML e utilizzando ng-if. Sulla base di questo, personalmente raccomando di non usare mai il modello in questa risposta. – sean2078

+0

@ sean2078 Non sto seguendo il monitoraggio, perché è stato un po 'di tempo da quando ho lavorato su questo problema. Puoi dare un esempio del problema e/o cosa hai trovato che funziona meglio, per i posteri? – ryanm

Problemi correlati