从静态javascript中提升会话有效ajax回调

从静态javascript中提升会话有效ajax回调,javascript,ajax,lift,Javascript,Ajax,Lift,我目前正在实现一个图形可视化工具,在服务器端使用lift,所有可视化都使用d3(javascript可视化框架)。我遇到的问题是,在脚本中,我希望从服务器获取依赖于会话的数据 所以基本上,我的目标是在静态js脚本中编写有效的ajax回调 到目前为止我都试过了 如果你觉得最好的解决方案是我已经尝试过的,请随意发布一个详细的答案,告诉我如何准确地使用它,以及它如何完全解决我的问题 使用lift在另一个脚本中编写ajax回调,并从主脚本调用它 这种类似于隐藏文本输入的解决方案可能更有效。然而,它并不优

我目前正在实现一个图形可视化工具,在服务器端使用lift,所有可视化都使用d3(javascript可视化框架)。我遇到的问题是,在脚本中,我希望从服务器获取依赖于会话的数据

所以基本上,我的目标是在静态js脚本中编写有效的ajax回调

到目前为止我都试过了 如果你觉得最好的解决方案是我已经尝试过的,请随意发布一个详细的答案,告诉我如何准确地使用它,以及它如何完全解决我的问题

使用lift在另一个脚本中编写ajax回调,并从主脚本调用它 这种类似于隐藏文本输入的解决方案可能更有效。然而,它并不优雅,这意味着我必须在加载时加载很多脚本,这并不是很方便

如中所述,这似乎是电梯社区首选的解决方案之一

REST接口 通常,从lift中的javascript函数获取数据的方法是创建一个REST接口。但是,此接口将不会链接到任何会话。这是我从上一个问题中得到的解决方案:

将函数作为脚本的参数 另一个解决方案是将ajaxcallback作为生成我的图所调用的主脚本的参数。然而,我希望有很多回调,我不想弄乱脚本的参数

在lift中编写整个脚本,然后将其提供给客户 这个解决方案可能很优雅,但是我的脚本很长,我真的希望它保持静态

我想要什么 在客户端 在查看我的网页的源代码时,我发现ajaxSelect的回调是:

<select onchange="liftAjax.lift_ajaxHandler('F966066257023LYKF4=' + encodeURIComponent(this.value), null, null, null)" name="F96606625703QXTSWU" id="node_delete" class="input">
因此,我想知道是否可以使用这个
liftAjax.lift\u ajaxHandler
函数来模拟我的ajaxcall是有效的。然而,我不知道确切的synthax使用

在服务器端 由于我在客户端“伪造”了一个请求,我现在希望在客户端获得该请求并将其发送到正确的函数。这就是
LiftRules.dispatch
对象似乎是最佳解决方案的地方:调用它时,所有会话管理都已完成(请求已验证并链接到会话),但我不知道如何在
append
函数中编写正确的代码段

评论 在lift中,所有变量的名称都被更改为随机字符串以提高安全性,我希望在我的应用程序中有相同的行为,即使这可能意味着我必须“给”javascript这些值。但是,作为javascript函数的参数,15个字符串值的数组仍然比15个函数更好

编辑 在我进行研究的过程中,我发现了这个页面:它以某种方式解释了命名函数的目标,即使它仍然不能引导我找到一个可行的解决方案

快速回答 电梯中的休息不必是无状态的。如果使用LiftRules.dispatch.append注册RestHelper,那么它将被有状态处理,会话信息将像往常一样通过S对象可用

长话短说 因为您似乎很感兴趣,而且之前也提到过,这里有一个更详细的解释,说明如何在Lift中注册和调用服务器端函数。如果你已经有一段时间没有和Lift一起工作了,请把目光移开。以下内容不应以任何方式用于评估电梯或其复杂性。这纯粹是库开发人员级别的东西,大多数Lift用户在不知情的情况下愉快地进行开发

工作原理 当您创建有状态回调时,通常使用SHtml对象中的方法,您真正要做的是在用户会话的上下文中注册S.AFuncHolder类型的对象,每个都有一个唯一的ID。在这个过程中生成的唯一ID就是您遇到类似
F96606625700QRXLDO
的模式时看到的ID。当通过表单post、ajax或其他方式提交数据时,Lift将检查这些函数ID的请求,并执行相关函数(如果存在)。有几个助手提供了更具体类型的AFuncHolder,如S.SFuncHolder(接受单个字符串查询参数)和S.BinFuncHolder(参数是多部分表单数据),但它们都返回任意值,后台Lift将收集这些返回值以创建适当类型的响应。例如,JsCmd将导致执行该命令的JavaScriptResponse。您也可以直接返回LiftResponse

如何使用它 使用S.fmapFunc方法注册解锁器。你会这样称呼它

S.fmapFunc(SFuncHolder({ (str: String) =>
  doSomethingAwesomeWithAString(str)
}))(id => <input type="text" name={id} value=""/>)
S.fmapFunc(SFuncHolder({(str:String)=>
多索美辛(str)
}))(id=>)
第一个参数是您的函数,用适当的*FuncHolder类型包装,第二个参数是一个函数,它接受生成的id并输出一些东西。获得输出的内容就是您将在页面上包含的内容。它会以某种方式将id作为查询参数发送到服务器,以便执行函数

把它们放在一起 您可以使用上述方法进行自己的Ajax调用,但当Lift进行Ajax调用时,还有一些其他注意事项:

1) 大多数浏览器只允许如此多的同时连接到给定域。三似乎是个神奇的数字。 2) 解释器通常会关闭它们所包含的代码段的范围,如果同时处理多个ajax请求,每个请求都在自己的线程中,则可能会发生不好的事情

为了解决这些问题,
liftAjax.lift\u ajaxHandler
函数对每个ajax请求进行排队,确保每次只向服务器发送一个请求

这种方法的缺点是它会使Ajax的开发变得困难
S.fmapFunc(SFuncHolder({ (str: String) =>
  doSomethingAwesomeWithAString(str)
}))(id => <input type="text" name={id} value=""/>)