【问题标题】:Iterate over a list from backing bean in JavaScript从 JavaScript 中的支持 bean 迭代列表
【发布时间】:2012-01-28 11:16:39
【问题描述】:

我有一个支持 bean 中的对象列表 我想在 JavaScript 中迭代它, 所以我尝试了以下方法:

<script>
    //<![CDATA[
    var length = #{fn:length(myBean.myList)};

    for (i = 0; i <= length; i++) {
        var value = '#{myBean.myList[i].id}';
        var label = '#{myBean.myList[i].firstName}';
        alert(value);
        alert(label);
    }
    //]]>
</script>

我在控制台中没有收到任何错误,但它显示空警报。这是如何引起的,我该如何解决?

【问题讨论】:

  • 我不是java专家,但我猜#的东西应该在服务器端执行,而你的循环和它的i变量在客户端。
  • el 可以在 JS 中执行没有问题,问题在于循环变量。

标签: javascript jsf jsf-2 el


【解决方案1】:

您需要先将其转换为 JS 对象数组。假设 id 是数字,方法如下:

var users = [
  <ui:repeat value="#{bean.users}" var="user" varStatus="loop">
    { id: #{user.id}, firstName: "#{user.firstName}" }#{loop.last ? '' : ','}
  </ui:repeat>
];

for (var i = 0; i < users.length; i++) {
    var user = users[i];
    alert(user.id);
    alert(user.firstName);
}

这只会在用户名包含换行符时失败(双引号已被 JSF 转义)。考虑按照Escape JavaScript in Expression Language显式转义JS

更好的方法是让 JSF(或者最好是一些 Web 服务,例如 JAX-RS,根据 ajax 请求)已经使用像 Google Gson 这样的 JSON 解析器/格式化程序以 JSON 格式返回它,这样你可以这样做:

var users = #{bean.usersAsJson};

for (var i = 0; i < users.length; i++) {
    var user = users[i];
    alert(user.id);
    alert(user.firstName);
}

with(假设您使用的是 Gson):

public String getUsersAsJson() {
    return new Gson().toJson(users);
}

还请注意,您应该使用i &lt; length 而不是i &lt;= length。另请注意,usersmyList 更具自我记录性。

【讨论】:

  • console.log(#{bean.property});当我调试 javaScript 时,它只显示为 console.log(),与 ui:repeat 或 c:foreach 相同,它显示 var users = []。它没有填充变量。
  • 这不是由在 Facelet 中的一段文本中调用 bean 引起的,该文本恰好代表 JavaScript 代码。
  • 我不明白,这是个问题吗?我在 .JSP 页面中的
  • 您在 JSP 页面中使用 Facelets 标签?您肯定遇到了与当前提出的问题无关的不同问题。
  • 是的,但是此页面中还有其他工作的 RichFaces 组件,例如
【解决方案2】:

我遇到了同样的错误,我通过使用解决了它 "&amp;lt;" 而不是

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2011-04-19
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多