#ajax #scala #comet #lift
#ajax #scala #comet #подъем
Вопрос:
Я пытаюсь получить параметр url в CometActor, чтобы проверить, соответствует ли источник данных месту назначения, например, пользователь отправляет сообщение из комнаты A, которое должно быть получено и отображено только в комнате A, а не B или C.
Я пробовал:
S.param("message").openOr("")
Но это всегда пусто, можно ли это сделать? Или есть другой способ остановить сообщения Comet, идущие туда, куда они не должны?
Заранее спасибо за любую помощь, очень признателен 🙂
Ответ №1:
CometActors существуют вне сеанса и поэтому не имеют доступа к (большей части) его. Решение заключается в инициализации субъекта с помощью сообщения инициализации, содержащего требуемые данные сеанса. Для этого есть какой-то помощник, возможно, в 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, если мы отправим класс case, содержащий:
// ...
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
}
}
}
Комментарии:
1. Итак, я использую ваш метод здесь с помощью фрагмента, который загружает всех участников comet для этой страницы. Все, что мне нужно знать сейчас, это как получить доступ к этим сообщениям из comet actor. Спасибо
2. Вы получаете их в одном из ваших обработчиков сообщений, например
lowPriority
.3. Не могли бы вы привести простой пример, такой как вызываемый метод, например, S.param(«комната»), где «комната» равна переданному параметру. Еще раз спасибо
Ответ №2:
CometActors существуют вне цикла HTTP-запроса / ответа. Это означает, что во время обработки сообщения в CometActor вы не видите запрос, потому что запрос никогда не доступен как часть обработки сообщений.
В отличие от некоторых сообщений в этой теме, контекст S доступен как SessionVars (но не RequestVars, поскольку CometActor находится за пределами области действия запроса).
(…)
Лучше всего создать SessionVar (или несколько SESSIONVAR), которые содержат хост и порт. Установите эти переменные сеанса из фрагмента (если они еще не установлены). Затем получите доступ к SessionVars из ваших CometActors.
Это один из возможных вариантов. Однако я лично предпочитаю вставлять comets на страницу с использованием NamedCometActorSnippet
и немедленно отправлять сообщение созданной comet:
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))
}
}