2014-05-24 10 views
5

Jestem biorąc pod uwagę następujący kodkątowa, ng-jeśli chcesz zmienić tekst?

<h2>{{ownername}} Online Bookshop</h2> 
<input placeholder="type your name" ng-model="ownername" > 

które wyjścia 'Online Bookshop'

i gdybym input 'Fred' wyprowadza 'Fred Online Bookshop'

Bez jQuery, i robi rzeczy w kanciasty sposób, w jaki sposób mogę zmienić kod tak, aby dodawano apostrof i dzierżawę, gdy wejście nie jest puste?

EG

Online Bookshop, gdy wejście jest puste, a

Freda Online Bookshop gdy wejściowy zawiera 'Fred' string

Odpowiedz

16

Pamiętaj, że zakres jest tylko miejscem, gdzie można oceniać rzeczy. Więc to jest dokładnie to, co możemy zrobić. ? jest trójskładnikowych operatora w postaci: (expression)?<true clause>:<false clause>; i jest równa:

if(expression) { <true clause>; } 
else { <false clause>; } 

Zmodyfikowany kod:

<h2>{{ ownername.length ? ownername + "'s " : "" }}Online Bookshop</h2> 
<input placeholder="type your name" ng-model="ownername" > 

Edit: Nawet jeśli to działa, jej chyba lepiej jak inni podkreślają, aby ukryć logikę przed widokiem. Można to zrobić, wywołując funkcję zasięgu lub stosując filtr do zmiennej, aby przekształcić ją zgodnie z oczekiwaniami.

+1

chyba nie można użyć operatora potrójny kątowym w ten sposób. – Quad

+0

da ci to błąd lexera: Błąd Lexera: nieoczekiwany następny znak w kolumnach 18-18 [?] W wyrażeniu [nazwa własna.length? ownername + "'s": ""]. – Quad

+0

@Quad AngularJS wspiera operator trójskładnikowy [przez ponad rok] (https://github.com/angular/angular.js/commit/6798fec4390a72b7943a49505f8a245b6016c84b) – user113215

4

Użyj filtra!

app.filter('possessive', function() { 
    return function(val) { 
    if (!val) return ''; 
    return val + '\'s'; 
    }; 
}); 

Następnie:

<h2>{{ ownername | possessive }} Online Bookshop</h2> 
+0

Nie mogę uzyskać tego do pracy – PrimeLens

+0

To działało dla mnie. Musiałem zmienić wartość true/false na yes/no na bool. – Anthony