Обратный вызов javascript в scala lift

#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 "');")