Перебирать список из вспомогательного компонента в JavaScript - PullRequest
5 голосов
/ 27 декабря 2011

У меня есть список объектов в базовом компоненте, и я хотел бы перебрать его в 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>

Я не получаю ошибок в консоли, но он показывает пустые предупреждения,Как это вызвано и как я могу решить это?

Ответы [ 2 ]

11 голосов
/ 27 декабря 2011

Сначала вам нужно преобразовать его в массив объектов 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).Рассмотрите возможность явного выхода из JS в соответствии с Избегайте JavaScript на языке выражений

Лучший способ - позволить JSF (или, предпочтительно, некоторому веб-сервису, например JAX-RS, по запросу ajax) вернуть его в JSON форматировать уже с использованием JSON-анализатора / форматера, например Google Gson , так что вы можете просто:

var users = #{bean.usersAsJson};

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

с (при условии, что вы используетеGson):

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

Обратите внимание, что вы должны использовать i < length, а не i <= length.Также обратите внимание, что users является более самодокументированным, чем myList.

0 голосов
/ 29 октября 2013

Я столкнулся с той же ошибкой и решил ее, используя "&lt;" вместо <в для цикла </p>

...