2014-11-23 14 views
11

Ho bisogno di mostrare il valore booleano su sì/no usando direttiva. La mia direttiva è riportata sottoConverti valore booleano in sì/no con direttiva angolare

directives.directive('niBooltoYesno', 
     function() { 
      return { 
       restrict: 'EA', 
       require: 'ngModel', 
       link: function (scope, element, attrs, ngModel) { 
        function formatter(value) { 
         if (value) { 
          return value === true ? 'Yes' : 'No'; 
         } else { 
          return ''; 
         } 
        } 
        ngModel.$formatters.push(formatter); 

       } 
      }; 
     }); 

<ni-boolto-yesno data-ng-model="set_unit.isActive" ></ni-boolto-yesno> 

Ma non funziona. Per favore aiutami in questo punto.

+0

Si dovrebbe descrivere esattamente _how_ non funziona o fornire un jsfiddle/codepen. – hon2a

+0

perché non qualcosa come {{user.booleanValue? 'Yes': 'no'}} –

risposta

49

Non stai utilizzando lo strumento giusto per il lavoro. Questo dovrebbe essere un filtro:

{{ someBooleanValue | yesNo }} 

Il filtro potrebbe essere semplice come

module.filter('yesNo', function() { 
    return function(input) { 
     return input ? 'yes' : 'no'; 
    } 
}); 

Se ancora sceglie di utilizzare una direttiva, non è necessario ngModel e formattatori, che viene utilizzato in forma campi che devono leggere e scrivere su un modello. Tutto ciò che serve è un modello:

module.directive('yesNo', function() { 
    return { 
     template: '<span>{{ yesNo ? "yes" : "no" }}</span>', 
     scope: { 
      yesNo: '=' 
     } 
    }; 
}); 

e profondo del cuore lo usano come

<span yes-no="someBoolean"></span> 
+0

Il filtro è perfetto per il mio caso. –

2

Il problema è if (value). Ciò fa sì che la riga return value === true ? ... venga elaborata solo quando il valore è effettivamente attendibile (vale a dire mai per false). Hai solo bisogno di costruire le condizioni correttamente:

function formatter (value) { 
    return (value === true) ? 'Yes' : ((value === false) ? 'No' : ''); 
} 

Una versione con una migliore leggibilità:

function formatter (value) { 
    if (value === true) { 
     return 'Yes'; 
    } else if (value === false) { 
     return 'No'; 
    } else { 
     return ''; 
    } 
} 

Edit: non ho guardato il vostro codice HTML. Come sottolinea un'altra risposta, usare ng-model per questa è una cattiva idea, la creazione di un filtro dovrebbe andare bene.

+0

l'annidamento sulle istruzioni if ​​è un po 'off (versione formattata). Non stai aggiungendo un blocco else-if. Il blocco else dell'operatore ternario conterrebbe un secondo blocco else – Kieran

+0

@Kieran 'se A {X} else {if B {Y} else {Z}}' è equivalente a 'if A {X} altro se B {Y } else {Z} 'e il codice appiattito è sempre più facile da leggere. – hon2a

5

definisco valori testuali per 0 e 1 con ...

{{object.PROPERTY?'Yes':'No'}} 

... quando presentato con qualcosa di simile:

{ 
    "PROPERTY": 0 
} 

Il risultato sarebbe quindi "No".

+1

Questa è davvero la risposta migliore. È semplice e pulito. La risposta di JB Nizet funziona perfettamente ma è eccessivo in questo scenario. È adatto a occasioni più complesse. – Rob

Problemi correlati