2013-08-22 15 views
19

Il JavaScript page for Bootstrap mostra un uso piacevole dei pulsanti per impostare caselle di controllo e campi radio. Ad esempio, per una casella di controllo, potrei scrivereLa casella di controllo Bootstrap/i pulsanti radio non cambiano <input> valore

<div class="btn-group" data-toggle="buttons"> 
    <label class="btn btn-primary"> 
    <input type="checkbox"> Option 1 
    </label> 
</div> 

Tuttavia, la libreria non in realtà modificare il valore del sottostante <input> campo - cambia solo se il campo <label> ha classe active. Mi sarei aspettato che cambiasse l'attributo checked nella casella di controllo. Apparentemente non ho solo una configurazione errata - questo è il modo in cui funzionano gli esempi sul sito Bootstrap.

È questo comportamento effettivamente previsto? Se è così, sembra abbastanza inutile, visto che le persone vorranno usare il campo checkbox. In caso contrario, come configurare correttamente le caselle di controllo/i pulsanti di opzione Bootstrap?

+1

Al momento non lo cambiano per davvero ... https://github.com/twbs/bootstrap/issues/14137 – Kolyunya

+0

L'aggiunta di un attributo "nome" consente di inviare i dati della casella di controllo, se questo è ciò che sperando – Mashakal

risposta

34

L'attributo checked sull'ingresso non viene modificato perché non è ciò che cambia quando un ingresso casella è selezionata - la proprietà checked DOM è quello che cambia (vero o falso) e Bootstrap lo gestisce correttamente (puoi controllare l'elemento in Firebug e vedere la modifica della proprietà DOM quando li attivi). L'attributo checked viene utilizzato solo per determinare il valore predefinito quando il DOM viene inizialmente sottoposto a rendering.

Questo comportamento non è speciale per i pulsanti Bootstrap, questo è il modo in cui funzionano tutte le checkbox/radio.

Edit: Firebug screenshot

+1

Interessante! Non avevo ancora capito questa distinzione. – jameshfisher

+17

@jameshfisher Se ti capita di fare js/jQuery con checkbox/radio, ricordalo! Se è necessario controllare in modo programmatico una casella di controllo o un pulsante di opzione, $ ('input'). Attr ('checked', 'checked'); 'non eseguirà il lavoro. '$ ('input'). prop ('checked', true);' è ciò di cui hai bisogno. – tomaroo

+0

@tomaroo il tuo commento sopra mi ha salvato da 3 giorni di tirata dei capelli. stava usando '$ ('input'). attr ('checked', 'checked');' invece di '$ ('input'). prop ('checked', true);'. salvavita! – suo

2

Sembra che manchi una chiamata per "attivare" il btn-group (documentation). Ecco a demo di questo lavoro:

<form id='testForm'> 
    <div class="btn-group" data-toggle="buttons"> 
     <label class="btn btn-primary"> 
      <input type="checkbox" name='Option' value='1' />Option 1</label> 
    </div> 
</form> 
<button class='btn' id='actionSubmit'>Submit</button> 

<script> 
    $('#actionSubmit').on('click', function (e) { 
     e.preventDefault(); 
     alert($('#testForm').serialize()); 
    }); 

    $('.btn-group').button(); 
</script> 
+1

In realtà non è necessario. Gli attributi dei dati attivano la libreria da soli. Rimuovi l'ultima riga di JS nella tua demo ('$ ('. Btn-group'). Button()') e funziona ancora. – colllin

1

Lo sto facendo in questo modo per MVC.NET nel caso qualcuno ne ha bisogno:

@{  
    var removeSelected = Model.Remove == true ? "active" : ""; 
    var buttonText = Model.Remove == true ? "Add" : "Remove"; 

} 

    @Html.HiddenFor(model => model.Remove) 
    <div class="editor-field"> 
     <div class="btn-group" data-toggle="buttons-checkbox"> 
       <button type="button" id="RemoveButton" class="btn btn-primary @removeSelected" onclick="toggle();">@buttonText</button> 
     </div 
    </div> 


function toggle() { 
      var value = $("#Remove").val(); 
      if (value == "False") { 
       $("#Remove").val("True"); 
       $("#RemoveButton").text("Add"); 
      } 
      else { 
       $("#Remove").val("False"); 
       $("#RemoveButton").text("Remove"); 
      }    
     } 

E infine non dimenticate di aggiungere refence il bootstrap js.

Problemi correlati