在JavaScript中迭代来自支持bean的列表

Sam*_*hat 5 javascript jsf el jsf-2

我有一个支持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>
Run Code Online (Sandbox Code Playgroud)

我在控制台中没有错误,但它显示空警报.这是怎么造成的,我该如何解决?

Bal*_*usC 11

您需要先将其转换为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);
}
Run Code Online (Sandbox Code Playgroud)

只有当用户名包含换行符时才会失败(双引号已被JSF转义).考虑根据表达式语言中的Escape JavaScript显式转义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);
}
Run Code Online (Sandbox Code Playgroud)

(假设您正在使用Gson):

public String getUsersAsJson() {
    return new Gson().toJson(users);
}
Run Code Online (Sandbox Code Playgroud)

另请注意,你应该使用i < length没有i <= length.还请注意,这users比自我记录更多myList.