VisualForce, Apex:Repeat, для обновления массива Javascript

это расширение вопроса, который я задавал на форумах разработчиков Salesforce, но который не получил большого распространения:

У меня есть страница VisualForce, которая требует частых изменений для загрузки новой информации из контроллера и внедрения этой информации в массив Javascript для дальнейшего использования.

Текущее решение: я успешно использовал браузерные технологии VisualForce, как описано здесь (в Wiki): http://wiki.developerforce.com/index.php/Using_Browser_Technologies_in_Visualforce_-_Part_1

Я окружаю Javascript array.push рекомендуемыми тегами:

<apex:repeat value="{!Object}" var="objects">       
    d.push( {
               element1: "{!objects.id}"            
    })
</apex:repeat>

Проблема: массив правильно заполняется при обновлении всей страницы, и когда я использую свой «раскрывающийся список» для изменения фильтра объекта (в контроллере), DOM обновляется (я вижу, что новая информация размещается на странице ),

В конечном счете, однако, массив Javascript не меняет свои значения, если я не вызываю обновление всей страницы, что как бы побеждает частичное обновление и является своего рода шоком для системы для пользователей.

Эта проблема «необходимого поста» раньше не была проблемой, и даже когда я напрямую вызываю функцию Javascript, которая содержит это заполнение массива после обновления DOM, массив Javascript не изменяется (поэтому я предполагаю, что он загружается один раз на основе того, что находится в DOM, когда страница первоначально публикуется и не может быть изменена.

Мысли?


person jordan.baucke    schedule 04.03.2011    source источник
comment
под Partial Refresh вы имеете в виду вызов AJAX?   -  person Shad    schedule 04.03.2011
comment
Visualforce имеет компонент разметки под названием UpdatePanel, который отображается как ajax-панель «javascript». Когда страница визуализируется и повторно визуализируется, эта панель ajax вызывается, и информация (в этом случае компоненты массива Javascript перезагружаются.   -  person jordan.baucke    schedule 08.03.2011


Ответы (1)


Если вы хотите контролировать, когда ваш массив обновляется, оберните его в панель вывода и поместите его идентификатор в атрибут rerender того, что вызывает необходимость обновления данных. Раньше мне приходилось использовать это, чтобы повторно подключить некоторые пользовательские прослушиватели ввода jQuery, когда каждый дом был повторно обновлен.

<apex:commandButton action="{!something}" rerender="scriptPanel"/>
<apex:outputPanel id="scriptPanel>
  <script>
     d = new Array();
     <apex:repeat value="{!objects}" var="object">
       d.push({
           element1: "{!objects.id}"            
       });
     </apex:repeat>
  </script>
</apex:outputPanel>
person Ralph Callaway    schedule 16.03.2011
comment
Спасибо, Ральф, у меня возникла проблема с отображением в массиве новых значений. Могу ли я подключить прослушиватель jQuery, который будет срабатывать при изменении элементов в массиве? - person jordan.baucke; 16.03.2011