2013-02-26 7 views
6

Praca z Jade & Express tutaj.Korzystanie z indexOf w Jade

'#{value.users}' to tablica.

'#{user.username}' to ciąg znaków.

Próbując zrobić if '#{value.users}'.indexOf('#{user.username}')

Jeśli to prawda, to wyświetli kilka rzeczy, w przeciwnym razie nie powinny być renderowane.

Jade jest w porządku ze składnią, ale nawet gdy #{value.users}'.indexOf('#{user.username}') jest falsy, treść instrukcji if jest renderowana.

Na przykład, jeśli user.username = bob, a value.users = ['tim', 'billy'], instrukcja if przechodzi, kiedy wyraźnie nie powinno być.

Co robię źle?

+0

Sprawdź, co '['tim', 'billy']. IndexOf ('bob')' daje: '-1'. Nie wartość falsy ('0') – Bergi

Odpowiedz

5

Nie znam Jade, ale czy nie musiałbyś testować przeciwko! = -1 lub == 1?

str.indexOf('#{user.username}') ! = -1 

lub od testowania przeciwko tablicy, coś wzdłuż linii.

array.toString().indexOf('#{user.username}') != -1 

UPDATE: Wraz z pojawieniem się ES6, zaktualizowałem trochę poniżej

array.includes('#{user.username}') // returns true or false 
str.includes('#{user.username}') // returns true or false 
+0

' array.toString() 'całkowicie zmienia znaczenie kodu. – Bergi

6

Jeżeli nie byłoby #{value.users.indexOf(user.username)}?

Wszystkie polecenia js wewnątrz #{} zostaną wykonane. Powinieneś być w stanie dopasować swój cały wyraz wewnątrz pojedynczego '#{}'

Mówiąc if '#{value.users}'.indexOf('#{user.username}')'#{value.users}' jest szeregowane w ciąg i przy użyciu .indexOf() to poszukiwania w obrębie łańcucha, zamiast oryginalnej tablicy.

Jeśli używasz go w instrukcji if, dlaczego nie po prostu wykonać bezpośrednio js? np.

- if (value.users.indexOf(user.username)) 
    p some jade 
- else 
    p alternate jade 

https://github.com/visionmedia/jade#a8

Alternatywnie, można użyć biblioteki podkreślenia.

http://underscorejs.org/#indexOf

Jeśli chcesz go używać wewnątrz szablonów Jade, należy require() to w aplikacji lub prośbę mieszkańców.

+0

@karaxuna thanks –