2011-11-20 9 views
12

Un'applicazione a cui sto lavorando utilizzando il Play! Framework ha un oggetto chiamato gift con una proprietà booleana, chiamato Taken. Come faccio a mostrare lo stato di questo valore come una casella di controllo sulla mia vista? Ho provato: -Come legare una casella di controllo a un valore booleano in Play! framework

<input id="gift_Taken" class="" type="checkbox" name="gift.Taken" value="true" /> 
<input type="hidden" name="gift.Taken" value="false" /> 

sulla base di esempi che ho visto dalle forme CRUD generati automaticamente, ma la casella di controllo non è selezionata quando la proprietà è True, che è quello che sto puntando.

Qualcuno conosce il modo corretto per raggiungere questo obiettivo?

+0

Basta impostare 'value = 'true'' nella casella di controllo e nella firma del metodo aggiungere un parametro' boolean take' che eseguirà il binding. –

risposta

9

È sufficiente impostare il valore checked rispetto alla casella di controllo, se il valore è true.

per esempio (supponendo che l'oggetto mandati dalla vista è chiamato gift, e il valore booleano è chiamato Taken.

<input id="gift_Taken" type="checkbox" name="gift.Taken" ${gift.Taken ? 'checked':''} /> 
+0

Perfetto - Adoro gli operatori ternari ;-) Nota a margine, andrò a prendere il tuo libro –

+1

L'operatore ternario è ancora più potente in Groovy. Controlla l'operatore elvis http://groovy.codehaus.org/Operators#Operators-ElvisOperator%28%3F%3A%29 – Codemwnci

+0

Ho provato questo e non ha funzionato. Ho provato " 'quindi questo dovrebbe averlo controllato tutto il tempo. Ma non è così. Qualche idea del perché? –

12

La risposta accettata in realtà non è corretta al 100% in quanto non gestisce il . case "incontrollato" per gestire entrambi i casi è necessario un campo nascosto:.

<input id="gift_Taken" type="checkbox" name="gift.Taken" ${gift.Taken ? 'checked':''} /> 
<input type="hidden" name="gift.Taken" value="false" /> 

Nota che la collocazione sembra essere importante, in modo che il campo nascosto deve essere dopo la casella di controllo

Scrivi tag modello personalizzato per questo, lo rende facile per non dimenticare l'ingresso nascosto (mettere questo in vista/tag/checkbox.html):

<input id="${_id}" type="checkbox" name="${_name}" value="true" #{if _checked} checked="checked" #{/if}> 
<input type="hidden" name="${_name}" value="false"> 

quindi chiamare questo modello come questo:

#{checkbox id:'gift_Taken', name: 'gift.Taken', checked: gift.Taken /} 

Vedi anche la relativa discussione sulla lista quadro gioco: https://groups.google.com/forum/?fromgroups=#!topic/play-framework/HygQuYF3a8E

+0

Sebbene non sia l'ideale, un'altra soluzione è se nel modello viene utilizzato un valore predefinito di false, l'assenza di un valore di casella di controllo inviato verrà interpretata implicitamente come falsa. Bandiere rosse dappertutto, ma degno di nota. – chris

+1

Grazie per il suggerimento per l'ordine (ad esempio php si usa la stessa soluzione, ma il campo nascosto è posizionato prima della casella di controllo)! – Bachi

0

Se siete in grado di utilizzare javascript, si può usare:

$(document).ready(function() { 
    $(":checkbox").each(function() { 
     var name = $(this).attr("name"); 
     if(typeof(name) != "undefined") { 
      var checkboxString = ""; 
      checkboxString = '<input type="hidden" style="display:none;" name="'+ name +'" value="false" />' 
      $(this).after(checkboxString); 
     } 
    }); 
}); 
Problemi correlati