#ajax #scala #callback #closures #lift
#ajax #scala #обратный вызов #замыкания #поднимите
Вопрос:
Итак, я поиграл с Lift в Scala, и мне это очень понравилось. Возможно, мне просто не хватает чего-то, что существует в библиотеке javascript lift, но я не смог найти какой-либо способ использования обратного вызова javascript с ограниченной областью. Похоже, что лучший способ обработки обратных вызовов lift — передать обратный вызов как имя функции и заставить lift возвращать JsCmd, который вызывает () функцию.
Мой код lift в значительной степени основан на этом примере http://demo.liftweb.net/json_more И мой javascript выглядит примерно так
function operation(config) {
var actions = config.actions,
action = actions.shift(),
name = config.name;
function chainAction(response) {
if (actions.length > 0) {
action = actions.shift();
action.action(name, chainAction);
}
}
action.action(name, chainAction);
}
operation({
name: "ajax",
actions: [
{ action: ajaxCall1 },
{ action: ajaxCall2 }
]
});
Где я бы хотел, чтобы ajaxCall1 и ajaxCall2 были вызовами AJAX для lift. т.е. callNoParam() в примере lift, а chainAction — обратным вызовом с ограниченной областью. Есть ли способ сделать это в lift, который мне не хватает? Для ясности я смог заставить этот код вызывать функцию lift, но не корректно обрабатывать обратный вызов.
Спасибо.
Редактировать
После прочтения кода javascript, созданного с помощью lift, похоже, что действительно есть заполнители для успешных / неудачных обратных вызовов. В частности, это выглядит как эта строка lift
AllJsonHandler.is.jsCmd
генерирует ли эта строка javascript
function F86737576748N5SY25(obj) {liftAjax.lift_ajaxHandler('F86737576748N5SY25=' encodeURIComponent(JSON.stringify(obj)), null,null);}
который ссылается на этот метод
lift_ajaxHandler: function(theData, theSuccess, theFailure, responseType)
Но не позволяет мне передавать theSuccess или theFailure, которые выглядят так, как будто они передаются в вызовы jQuery.ajax(). Мое расследование продолжается. Если у кого-нибудь есть хорошие ресурсы на is.jsCmd, это было бы оценено.
Комментарии:
1. Вы пробовали эту
SHtml.ajaxCall
функцию? Я не знаю, то ли это, что вы ищете.2. Одна из причин, по которой вы не получили ответа, заключается в том, что вопрос действительно сбивает с толку. Я думаю, что смогу ответить на него, если буду уверен, чего вы хотите. Похоже, вы хотите, чтобы функция Javascript использовала AJAX для вызова чего-либо на стороне сервера, а затем часть на стороне сервера вызовет
chainAction(response)
ответ, когда он будет завершен. Это правильно?
Ответ №1:
Ниже приведен фрагмент кода, который добавляет функцию Javascript doCallback
на страницу (в #placeholder
). Эта функция выведет строку на консоль, а затем выполнит AJAX-обратный вызов функции на сервер commandCallback
.
def addExecuteCallback(ns: NodeSeq):NodeSeq = {
val log = JsRaw("console.log('[doCallback] Generated from Lift.');").cmd amp;
SHtml.ajaxCall(JsRaw("commandString"), commandCallback _)._2.cmd
val f = JsCmds.Function("doCallback", List[String](), log)
("#placeholder" #> JsCmds.Script(f)).apply(ns)
}
В конце commandCallback
вы можете вернуть:
JsCmds.Run("chainAction('" valueOfResponse "');")