【问题标题】:SCALA Lift - S.param access within Comet ActorSCALA Lift - Comet Actor 内的 S.param 访问
【发布时间】:2011-10-27 11:31:52
【问题描述】:

我正在尝试在 CometActor 中检索 url 参数以验证数据源是否与目标匹配,例如,用户从房间 A 发送消息,该消息应仅在房间 A 中接收和显示,而不是在房间 B 中或 C。

我试过了:

S.param("message").openOr("") 

但是总是空的,这样可以吗?还是有其他方法可以阻止 Comet 消息发送到不应该发送的位置?

提前感谢您的帮助,非常感谢:)

【问题讨论】:

    标签: ajax scala comet lift


    【解决方案1】:

    CometActor 存在于会话之外,因此无法访问(大部分)它。解决方案是使用包含所需会话数据的初始化消息来初始化参与者。有某种帮手,也许在 LiftRules 中,可以做到这一点。我正在用手机回忆这件事,但希望这足以继续。

    具体来说,您将要执行以下操作:

    for (
      session <- S.session
      message <- S.param("message")
    ) {
      session.setupComet("myCometActor", Some("unique name, if you want it"), message)
    }
    

    在你的Boot.scala.

    查看LiftSession 了解更多信息。我认为可能有一种方法可以连接到LiftRules,以便在创建会话时调用相关代码......

    更新:如果我们发送包含以下内容的案例类,您的 CometActor 可能会是这样的:

    // ...
    session.setupComet(
      "myCometActor",
      Some("unique name, if you want it"),
      Message(message)
    )
    // ...
    case class Message(text: String)
    
    class CometMessage extends CometActor { 
      override def lowPriority = {
        case Message(text) => {
          // do something here with the text, whether settings a SessionVar or even just a plain var
        }
      }
    }
    

    【讨论】:

    • 好的,我在这里通过一个 sn-p 使用您的方法,该方法为该页面加载所有彗星演员。我现在只需要知道如何从彗星演员内部访问这些消息。谢谢
    • 您在其中一个消息处理程序中收到它们,例如lowPriority
    • 您能否举一个基本示例,例如调用的方法,例如 S.param("room") 其中“room”等于传递的参数。再次感谢
    【解决方案2】:

    来自Lift's mailing list

    CometActor 存在于 HTTP 请求/响应周期之外。这意味着在 CometActor 中处理消息期间,您看不到 Req,因为在消息处理过程中从来没有 Req 可用。

    与此线程上的某些帖子相反,S 上下文 和 SessionVars 一样可用(但 RequestVars 不可用,因为 CometActor 超出了请求的范围)。

    (...)

    最好的办法是创建一个保存主机和端口的 SessionVar(或几个 SessionVar)。从 sn-p 设置这些 SessionVars(如果尚未设置)。然后从 CometActor 访问 SessionVars。

    这是一种可能的选择。但是,我个人的偏好是使用NamedCometActorSnippet 将彗星插入页面并立即向创建的彗星发送消息:

    class MyCometSnippet extends NamedCometActorSnippet {
    
      val cometClass = "MyComet"
      val name = "MyComet-instance"
    
      for {
        liftSession <- S.session
        processingMode <- S.param("message")
      } yield {
        liftSession.sendCometActorMessage(cometClass, Full(name), SetMessageValue(message))
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多