Wie aktualisiere ich eine HTML-Klasse von einem CometActor
Frage
Als Reaktion auf einige asynchrone Ereignis auf dem Server, möchte ich die Klasse eines HTML-Knoten aktualisieren, um seinen aktuellen Status zu reflektieren. Ich weiß, dass die ID des Knotens, und die Klasse ich mag es zu ändern. Was JsCmd muss ich die Klasse zu aktualisieren verwenden? In der Regel, wo kann ich eine gute Referenz auf dem JsCmd finden und was sie tun?
Ein einfaches Beispiel:
case class UpdateClass(id: String, htmlClass: String)
class ClassUpdater extends CometActor {
override def lowPriority: scala.PartialFunction[scala.Any, scala.Unit] = {
case UpdateClass(id, htmlClass) =>
partialUpdate(Noop /* now what? */)
}
def render = NodeSeq.Empty
}
Also, wenn ich die HTML hatte:
<html><body>
<lift:comet type="ClassUpdater"/>
<div id="foo" class="bar">insert text here</div>
</body></html>
Wenn ich die Nachricht UpdateClass("foo", "baz")
meiner ClassUpdater
gesendet, möchte ich die Klasse meiner div
Änderungen zu baz
.
Lösung
Edit: Ich habe einen besseren Weg, es zu tun gefunden. Der alte Code ist jetzt eher ein Entwurf für kompliziertere Sachen.
Sieht aus wie es ist ein einfacher Weg, um es ohne jQuery zu tun:
SetElemById("foo", JE.Str("baz"), "className")
, die mit einem JavaScript-Aufruf übersetzt
document.getElementById("foo").className = "baz";
Beachten Sie, dass JE.Str("baz")
jede JsExp
sein kann, und wenn Sie sehen auch etwas tun könnte
SetElemById("foo", JE.Str("baz"), "firstChild", "className")
, die die Klasse des ersten Kindes ändern würde. (Siehe auch: SetElemById )
Sie können einen Blick auf den Code für den JsCMD Merkmal für das, was sonst ist möglich mit build-in-Befehle.
Falls Sie wollen etwas kompliziert, aber so etwas wie dies könnte Ihnen helfen. Er sendet einen jQuery-Befehl, der die Klasse in #oldId
zu newClass
ändern wird.
case class ChangeClassAtId(oldId: String, newClass: String) extends JsCmd {
def toJsCmd = """try {
$(""" + ("#" + oldId).encJs + """).attr("class", """ + newClass.encJs + """);
} catch (e) {}"""
}
Ändern Sie alle Vorkommen einer Klasse überall ein bisschen ist komplizierter:
case class ChangeClass(oldClass: String, newClass: String) extends JsCmd {
def toJsCmd = """try {
$(""" + ("." + oldClass).encJs + """).each(function(){
$(this).addClass(""" + newClass.encJs + """).removeClass(""" + oldClass.encJs + """);
});
} catch (e) {}"""
}
Sie sollten es statt Noop
natürlich verwendet werden.
Andere Tipps
EDIT - ich die Frage falsch verstanden. Meine Antwort lediglich aktualisiert den Inhalt des div.
Sie werden so etwas wie dies wollen:
Fall UpdateClass (id, htmlClass) => partialUpdate (SetHtml (id, Text ( "TEXT SHOVE IN DIV")))