【问题标题】:Why can't I pass a Javascript variable to a bean method directly?为什么我不能直接将 Javascript 变量传递给 bean 方法?
【发布时间】:2019-05-01 15:27:36
【问题描述】:

如何将 Javascript 变量(字符串)直接传递给 bean 方法?当我尝试以下操作时,它不起作用。

var dd = document.getElementById("j_idt2:ddcust");  
var customer = dd.options[dd.selectedIndex].value;

var credit = document.getElementById("j_idt2:credit");

credit.value = #{creditController.getCreditScore(customer)};

但是,如果我将字符串硬输入到方法调用中(见下文),它会起作用。

var dd = document.getElementById("j_idt2:ddcust");  
var customer = dd.options[dd.selectedIndex].value;

var credit = document.getElementById("j_idt2:credit");

credit.value = #{creditController.getCreditScore("Bau GmbH")};

但我不想硬编码。我的错误在哪里?帮助将不胜感激!

【问题讨论】:

  • 看起来你有很多客户端javascript(用户界面/框架知识)。像这样的东西也不起作用,您需要一些与“ajax”相关的功能。这就是下面答案中使用的内容。

标签: javascript jsf methods parameter-passing javabeans


【解决方案1】:

您不能这样做,因为 javascript 在您的网络浏览器中进行评估,而表达式语言表达式(如 #{creditController.getCreditScore("Bau GmbH")};)正在服务器端进行评估,即使 javascript 被发送到评估它的浏览器。

但是,您至少可以通过以下方式将 javascript 变量内容发送回服务器并将其分配给托管 bean 属性:

作为结论,您不会有一个干净的客户端,只有 javaScript 执行将 javascript 变量传递给 EL 表达式并将 EL 表达式返回值分配给 javascript 变量,而不需要对服务器进行任何回发操作。

【讨论】:

  • EL 值表达式在渲染时被评估;-)。 “值”属性(以及样式、样式类等)中的所有内容也是页面中“直接”的所有内容,就像示例中那样简单)。顺便说一句,有一种重复描述了这一点。但无论如何都是一个很好的答案。干杯!
  • 我刚试过这个。我现在如何通过返回我的 bean 方法来设置 outputText(在我的情况下是信用评分)?我按照描述通过了 javascript 变量,但是我不确定如何将方法的结果放回我的表单中
  • 如果使用p:remoteCommand,则需要在update属性中指定要刷新的组件ID。如果你使用f:ajax,你需要在`render-attribute.然后,这些组件将在 ajax 响应时使用来自服务器的新状态进行填充。
  • @Kukeltje 不确定我是否正确 - 是否是粗体字“之前”不完全正确?因为渲染和发送是同时发生的?随意链接到那种重复,我没有找到真正的重复,因为这个问题有点特殊^^
  • 不,前面是对的,只是不是 all* EL 表达式在渲染之前被评估。方法表达式在之后进行评估(例如,在从按钮或“远程命令”提交时,OP 可能已经得到这样的印象,即通过添加 (...) 作为参数,它会自动成为方法表达式(在早期,您可以没有带参数的值表达式(我现在想到的甚至没有方法)。不,没有真正的重复。更多的附加链接有助于解释值与方法以及一切发生的那一刻。我会寻找它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2015-04-06
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多