Funziona:
switch (true) {
case liCount == 0:
setLayoutState('start');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case liCount<=5 && liCount>0:
setLayoutState('upload1Row');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case liCount<=10 && liCount>5:
setLayoutState('upload2Rows');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case liCount>10:
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
}
Una versione precedente di questa risposta considerava le parentesi il colpevole. In verità, le parentesi qui sono irrilevanti: l'unica cosa necessaria è switch(true){...}
e affinché le espressioni del tuo caso vengano valutate come booleane.
Funziona perché il valore che diamo all'interruttore viene utilizzato come base per il confronto. Di conseguenza, le espressioni case, valutando anche booleani, determineranno quale caso viene eseguito. Potrebbe anche capovolgere questo, e passare switch(false){..}
e fare in modo che le espressioni desiderate valutino false invece che vere .. ma personalmente preferisco trattare condizioni che valutano veridicità. Tuttavia, funziona anche lui, quindi vale la pena tenerlo a mente per capire cosa sta facendo.
Ad esempio: se liCount è 3, il primo confronto è true === (liCount == 0)
, il che significa che il primo caso è falso. L'interruttore passa quindi al caso successivo true === (liCount<=5 && liCount>0)
. Questa espressione restituisce true, il che significa che questo caso viene eseguito e termina in break
. Ho aggiunto parentesi qui per renderlo più chiaro, ma sono opzionali, a seconda della complessità della tua espressione.
È piuttosto semplice e un modo pulito (se si adatta a ciò che stai cercando di fare) per gestire una lunga serie di condizioni, dove forse una lunga serie di condizioni ìf() ... else if() ... else if () ...
potrebbe introdurre molto rumore visivo o fragilità.
Usare con cautela, perché è un pattern non standard, nonostante sia un codice valido.