2011-01-14 5 views
0

Ich habe AjaxRadio in meiner Form, aber Lift generiert unerwünschte Markup für mich (es umschließt Eingabe-Tag mit span, und ich möchte Etikett etikettieren). Es ist möglich, Standard toForm Funktion oder genau überschreiben Methode HTMLize außer Kraft zu setzen, dieOverride Lift ajaxRadio toForm Standard-Markup

object ChoiceHolder { 
    var htmlize: ChoiceItem[_] => NodeSeq = c => (<span>{c.xhtml} {c.key.toString}<br/> </span>) 
    } 

So genannt wird, wie zu bekommen, dass die Etiketten um Eingangs-Tags sein wird und nicht Spannweiten?

vielen Dank.

Antwort

2

Bedenkt man, dass die ChoiceItem so etwas wie

ist
val choiceItem = ChoiceItem("Some key", <input type="radio" value="val" name="somename" />) 

und rufen Sie die toForm Methode als

ChoiceHolder(Seq(choiceItem)).toForm 

folgt man

ChoiceHolder.htmlize = ci => evalElemWithId((id, e) => e ++ <label for={id}>{ci.key.toString}</label>)(ci.xhtml) 

verwenden könnte, die so etwas wie

zurückkehren könnte
NodeSeq(<input name="somename" type="radio" value="val" id="F212153483008MMP"></input>, <label for="F212153483008MMP">Some key</label>) 

oder, wenn Sie das Etikett um

ChoiceHolder.htmlize = ci => evalElemWithId((id, e) => <label for={id}>{e} {ci.key.toString}</label>)(ci.xhtml) 

wickeln möchten, die Sie

NodeSeq(<label for="F689721302326S3S"><input name="somename" type="radio" value="val" id="F689721302326S3S"></input>Some key</label>) 

etwas kompliziert gibt: evalElemWithId (Import net.liftweb.util.Helpers.evalElemWithId) nimmt das erste Element einer NodeSeq (z.B choiceItem.xhtml) und fügt ein id-Attribut hinzu. Danach wird die anonyme Funktion aufgerufen, die diese ID erhält, damit Sie sie im for Attribut des Labels verwenden können.

bearbeiten Beachten Sie, dass ChoiceHolder.htmlize Art einer globalen Funktion, die durch alle ChoiceHolder.toForm Anrufe aufgerufen wird. Es macht also nur Sinn, sie global zu ändern, wenn Sie überall das gleiche Layout haben wollen.

Wenn Sie nur ein bestimmtes Layout in einem Fall haben möchten, ist es wahrscheinlich besser, rufen Sie einfach einige choiceToForm Methode.

+0

vielen Dank für die Hilfe, aber ich weiß nicht wissen, wie Sie Ihren Code verwenden. Ich habe versucht, Ihre ChoiceHolder.htmlize, aber Compiler warnt mich, dass es nicht über evalElemWithId weiß. Ich kann nicht herausfinden, wo ich diesen Code schreiben soll. Um Klasse zu besitzen? Neues Objekt erstellen? – kajo

+0

'import net.liftweb.util.Helpers.evalElemWithId' – Debilski

+0

@kajo: Sorry, ich habe tatsächlich einen Fehler gemacht.Sollte jetzt gut sein ... – Debilski

1

Also endlich habe ich selbst eine Lösung gefunden. Es ist nicht so sauber, hätte ich erwartet, aber es funktioniert!

So für die zukünftige Generation mit dem gleichen Problem - ich wickeln ajaxRadio mit meiner eigenen Funktion:

choicesToMyForm(SHtml.ajaxRadio(...)) 

und diese Funktion wie folgt aussieht:

def choicesToMyForm(choices : ChoiceHolder[String]) : NodeSeq = 
{ 
    choices.flatMap(c => (<label>{c.xhtml} {c.key.toString}</label>)) 
}