2013-04-03 16 views
8

Questo è il lavoro:Usa Twitter Bootstrap gruppo di pulsanti di come la radio selezionare con attacchi ad eliminazione diretta

view.html

<div><input type="radio" name="radioPriority" data-bind="checked: priority" value="want" style="margin-top: -3px; margin-right: 3px;" />I want to</div> 
<div><input type="radio" name="radioPriority" data-bind="checked: priority" value="need" style="margin-top: -3px; margin-right: 3px;"/>I need to</div> 

controller.js

function feedbackViewModel() { 
    var self = this; 
    self.priority = ko.observable("want"); 
    //lots of other stuff 
} 

Come previsto, quando selezionate la seconda radio il valore di priorità osservabile cambia in "bisogno". Tuttavia, mi piacerebbe utilizzare un gruppo di pulsanti Bootstrap di Twitter come radio. Ecco il codice HTML che ho, ma non cambia il osservabile come previsto:

<span class="btn-group" data-toggle="buttons-radio"> 
    <button data-bind="checked: priority" type="button" class="btn" value="want">I want to</button> 
    <button data-bind="checked: priority" type="button" class="btn" value="need">I need to</button> 
</span> 

aggiornamento ho un jsfiddle andando qui: http://jsfiddle.net/a8wa8/6/ "priority1" è la seleziona radio standard e "priority2" è il bootstrap pulsanti.

risposta

9

Il problema è che si sta utilizzando il collegamento Checked con il pulsante che non è consentito, invece è possibile utilizzare il collegamento dei clic. controllare questo violino:

http://jsfiddle.net/a8wa8/7/

Aggiornato:

Sì, è possibile raggiungere questo obiettivo utilizzando ko css binding. Controllare questo violino aggiornamento:

Updated Fiddle

+0

Funziona bene tranne che quando cambio il modello non aggiorna la vista. Ad esempio, impostando priority2 ('want') in modo pragmatico non si seleziona il pulsante appropriato. È facilmente fattibile? –

+1

@ScottBeeson si prega di controllare la mia risposta aggiornata e fammi sapere è questo quello che vuoi? – gaurav

+0

Perfetto! Grazie –

6

L'checked binding funziona solo con controlli "verificabili" come casella di controllo (<input type='checkbox'>) o di un pulsante di opzione (<input type='radio'>).

Ma si ha button nel secondo esempio in cui bootstrap emula l'aspetto del gruppo di pulsanti di opzione in modo che l'associazione checked non funzioni.

Tuttavia è possibile utilizzare il click binding in cui si passa il valore alla vostra osservabile:

<span class="btn-group" data-toggle="buttons-radio"> 
    <button data-bind="click: function() { priority2('want') }" 
      type="button" class="btn" value="want">I want to</button> 
    <button data-bind="click: function() { priority2('need') }" 
      type="button" class="btn" value="need">I need to</button>  
</span> 

E si può nascondere questo dietro una consuetudine vincolante:

ko.bindingHandlers.valueClick = { 
    init: function(element, valueAccessor, allBindingsAccessor, 
        viewModel, bindingContext) {  
     var value = valueAccessor(); 
     var newValueAccessor = function() { 
      return function() { 
       value(element.value); 
      }; 
     }; 
     ko.bindingHandlers.click.init(element, newValueAccessor, 
      allBindingsAccessor, viewModel, bindingContext); 
    }, 
} 

Quindi è possibile utilizzare come:

<span class="btn-group" data-toggle="buttons-radio"> 
    <button data-bind="valueClick: priority2" 
      type="button" class="btn" value="want">I want to</button> 
    <button data-bind="valueClick: priority2" 
      type="button" class="btn" value="need">I need to</button>  
</span> 

Demo JSFiddle.

+0

Questo funziona anche, anche se è molto più complessa di quanto la risposta di Gaurav, ma ha lo stesso problema. Non è un legame a doppio senso. Se imposto priorità ('want') e priority2 ('want'), vedrai che la radio viene selezionata automaticamente ma il pulsante bootstrap non lo è. –

+0

Se si desidera avere anche il collegamento a due vie, è necessario combinare il 'clic' con il collegamento' css'. Il mio bindinghandler personalizzato 'valueClick' può essere esteso per gestire anche questo caso. All'inizio può sembrare complicato ma è una soluzione molto più gestibile. Perché nella tua risposta accettata devi ripetere "voglio" e "aver bisogno" 3 volte e "priorità2" 2 volte sui pulsanti. D'altra parte con un binding personalizzato è necessario scrivere tutto una volta. – nemesv

+0

@nemesv Duuuuude che le tue soluzioni siano perfette per quello di cui ho bisogno. Grazie, dovrò estendere la funzionalità di 'valueClick' per gestire l'associazione bidirezionale, come hai detto tu, ma finora è perfetto. – Skytiger

Problemi correlati