2011-10-12 3 views
31

voglio legare una classe div css per una proprietà del modello di vista in questo modo:Knockout legame classe CSS a una proprietà modello osservato

<div id="statusIndicator" data-bind="css: selectedPriority"> 

Ma questo genera il risultato:

<div id="statusIndicator" class=" 0 1 2 3"> 

Questo è il modello di visualizzazione:

myViewModel = { 
    selectedPriority: ko.observable('High'), 
    Company: ko.observable("Bert"), 
    Rows: ko.observableArray([ 
     new row(), 
     new row(), 
     new row() 
    ]), 
    Tabs: ['High', 'Medium', 'Low'], 

    selectPriority: function (tab) { 
     this.selectedPriority(tab); 
    } 
}; 

Quindi quando carico la pagina che utilizza questo modello di vista voglio che div diventi:

<div id="statusIndicator" class="High"> 

Cosa sto facendo di sbagliato?

+6

Come ho osservato nella risposta di RPNiemeyer sembra che questi tipi di attacchi classe dinamica sono ora supportato in Knockout 2.2.0. Stavo avendo questo problema in 2.1.x, e aggiornato alla 2.2.0, e ora funziona. –

+2

@ChrisJaynes avresti dovuto fare di questo commento una risposta. Ci vuole un po 'per notarlo come un commento. – CoderDennis

+0

@CoderDennis - ha avuto lo stesso problema che hai descritto, quindi ho aggiunto una risposta a proposito di knockout 2.2.0. – mg1075

risposta

43

Per questa situazione si può fare:

<div data-bind="attr: { 'class': selectedPriority}"> 

L'unico svantaggio di questo metodo è che imposterà la classe direttamente anziché attivare o disattivare una classe, quindi se si utilizzano più classi, quindi selectedPriority è necessario contenere l'elenco completo di classi.

+0

Questo è ancora il modo di farlo in Knockout 2.0? – GraemeMiller

+4

Sì, è sempre lo stesso in 2.0. Esiste un esempio di associazione che attiva e disattiva una classe (anziché completare la sostituzione dell'attributo class) qui: https://github.com/SteveSanderson/knockout/wiki/Bindings---class. –

+0

Grazie RP, questo è quello che stavo davvero cercando. Sapevo di attr attr, ma speravo ce ne fosse uno solo per l'attributo "class", e quello nel tuo link lo gestisce esattamente come volevo. Inoltre, ho provato il binding attr, e ha funzionato su tutto tranne l'iPad. Ho trovato un problema di knockout specifico per Safari a riguardo (https://github.com/SteveSanderson/knockout/issues/233) e ho provato i workarounds con le virgolette, ma non sono riuscito a farlo funzionare. Con l'associazione personalizzata di Steve, però, ha funzionato alla grande! –

4

Come accennato nei commenti di @Chris Jaynes, Knockout 2.2.0 semplifica l'impostazione dei nomi delle classi, come descritto in un post sul blog dall'autore di Knockout Steve Sanderson.

http://blog.stevensanderson.com/2012/10/29/knockout-2-2-0-released/

Come per la posta:

Abbiamo anche fatto alcune caratteristiche lavorare di più come si potrebbe sempre avere pensano che dovrebbero funzionare. Ad esempio, il legame css possono ora collegare nomi delle classi CSS a livello di codice generati da elementi (in precedenza, è era limitato a nomi di classe CSS predefiniti non girevoli)

Il post sul blog include anche un jsfiddle si può giocare con a vedere l'associazione in azione. http://jsfiddle.net/qRmfH/light/

Nota la css sintassi di associazione nel suo esempio, css: chosenTicketCss, che è un computed observable che restituisce un nome di classe CSS:

<p data-bind="visible: chosenTicket, css: chosenTicketCss"> 
    Excellent choice! Suits you perfectly. 
</p> 
+0

Ho passato solo mezza giornata a cercare di capire perché il mio codice che seguiva perfettamente la documentazione non funzionasse. Abbiamo scoperto che eravamo ancora su 2.1 e il binding css è cambiato tra 2.1 e 2.2. Grazie per avermi guidato nella giusta direzione per capire che stava succedendo. –