如何从CometActor更新HTML类

时间:2010-11-01 16:09:12

标签: scala scala-2.8 lift

为了响应服务器上的某些异步事件,我想更新HTML节点的类以反映其更新状态。我知道节点的id,以及我要将其更改为的类。我需要使用什么JsCmd来更新类?一般来说,我在哪里可以找到关于JsCmd及其作用的好参考?

一个简单的例子:

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
}

所以,如果我有HTML:

<html><body>
<lift:comet type="ClassUpdater"/>
<div id="foo" class="bar">insert text here</div>
</body></html>

如果我将UpdateClass("foo", "baz")邮件发送到ClassUpdater,我希望我div的班级更改为baz

2 个答案:

答案 0 :(得分:4)

编辑: 我找到了更好的方法。旧代码现在更像是一个更复杂的蓝图。

看起来没有jQuery就有更直接的方法:

SetElemById("foo", JE.Str("baz"), "className")

转换为JavaScript调用

document.getElementById("foo").className = "baz";

请注意,JE.Str("baz")可以是任何JsExp,如果您还可以执行类似

的操作
SetElemById("foo", JE.Str("baz"), "firstChild", "className")

这会改变第一个孩子的班级。 (见:SetElemById

您可以查看JsCMD特征的代码,了解内置命令的其他功能。


如果您想要更复杂的东西,这样的事情可能对您有所帮助。它发送一个jQuery命令,它将#oldId中的类更改为newClass

  case class ChangeClassAtId(oldId: String, newClass: String) extends JsCmd {
    def toJsCmd = """try {
      $(""" + ("#" + oldId).encJs + """).attr("class", """ + newClass.encJs + """);
    } catch (e) {}"""
  }

在任何地方更改所有出现的类都有点复杂:

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) {}"""
  }

当然,您应该使用它而不是Noop

答案 1 :(得分:0)

编辑 - 我误解了这个问题。我的回答只是更新了div的内容。

退房:http://github.com/lift/lift/blob/master/examples/example/src/main/scala/net/liftweb/example/comet/Clock.scala

你会想要这样的东西:

case UpdateClass(id,htmlClass)=&gt;   partialUpdate(SetHtml(id,Text(“TEXT TO TOO DIV”)))