2014-09-29 1 views
0

Это сводит меня с ума сегодня, поэтому мне нужно выяснить, что я делаю что-то неправильно или принципиально неправильно понимаю, как это работает.Повторить кеширование тегов?

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

<xp:text 
     id="test1" 
     value="#{claimsFiledReport.rows}"> 
    </xp:text> 
    <xp:repeat 
     id="repeatDataRows" 
     value="#{claimsFiledReport.rows}" 
     var="row" 
     repeatControls="true"> 

     <... stuff here ...> 

    </xp:repeat> 

Подложка боб поставляя эту информацию следующим образом:

public List<List<String>> getRows() { 
    System.out.println("running getRows()"); 
    List<List<String>> list = new ArrayList<List<String>>(); 
    for (ReportLine line : getLines().values()) { 
     List<String> lineData = new ArrayList<String>(); 
     lineData.addAll(line.getValueStringList()); 
     list.add(lineData); 
    } 
    return list; 
} 

Теперь для части I не понимаю:

Когда я впервые загружаю страницу, консоль печатает running getRows() дважды, а в браузере все пустое, потому что отчет еще не запущен. Затем у меня есть кнопка, которая запускает отчет и обновляет таблицу, содержащую оба этих элемента управления. Когда это произойдет, running getRows() печатается только один раз, и только текстовое управление показывает данные. Регулятор повтора остается пустым. Поэтому единственное, что имеет смысл, это то, что элемент управления повторением кэширует результат getRows(), но это не то поведение, которое я ожидаю.

Кроме того, если я ставлю runReport() в качестве первой линии getRows(), то моя таблица заполняется данными по умолчанию, и если я пытаюсь изменить свой фильтр и повторно запустить отчет, таблица не меняется, а расчетное обновление текста.

Итак, мой вопрос заключается в том, не понимаю ли я, как интерфейс повторного управления взаимодействует с бэк-файлом, и если да, то как обойти это, или если у меня есть какая-то проблема с реализацией, которую я просто не могу найти.

+0

Сюжет сгущается: я добавил элемент управления пейджером для повторного управления и, похоже, решил проблему. Чтобы сделать это, я удалил 'repeatControls = true' и установил' rows = 30'. Они были настроены таким образом, чтобы весь отчет отображался на одной странице, поэтому это не идеальное решение. Я буду исследовать далее ... –

+0

Какова область вашего компонента?BTW вы можете полностью вычислить элементы управления пейджером, установив для свойства «alwaysComputeLast» значение «true» –

ответ

1

repeatControls="true" означает «получить содержимое для повторения на странице загрузки и никогда после этого». Таким образом, содержимое повтора - это то, что они были в первый раз, когда страница была загружена. В вашем первом примере runReport() не имеет данных, поэтому повтор пуст. Во втором примере устанавливается runReport(), поэтому отчет пуст. Но repeatControls, являющийся истинным, означает, что он создал набор элементов управления для каждого элемента runReport() и сохранил их.

Вычисленное полевое управление пока отображает обновленную информацию, потому что это значение является динамическим.

Подумайте, как установить loaded="#{viewScope.myVal==true}" на панели и попытаться использовать частичное обновление, чтобы показать эту панель, установив viewScope.myVal=true. Точно так же вы получаете то, что у вас было при загрузке страницы.

В принципе, если вы хотите изменить контент в повторе (включая использование пейджера), вы не можете использовать repeatControl="true".

Разница между установкой repeatControls и использованием привязки нагрузки страницы ($ {...}) от значения повтора заключается в том, что, выполняя привязку загрузки страницы, вы все равно можете использовать пейджер. Вариант использования - это если вы хотите создать содержимое элемента управления повтора в дереве компонентов, но затем удалить повтор из дерева компонентов.

getRows() будет работать дважды на загрузке страницы, потому что он вызван из двух компонентов, это нормально.

+0

Спасибо, Пол. Я пытался просто показать весь отчет на одной странице, не беспокоясь о том, сколько строк есть, и, следуя тексту справки для строк, мне показалось, что мне нужно установить 'repeatControls =" false "' в порядке чтобы это работало. И это послало меня по неверному пути. Еще раз спасибо. –

+1

Одним из вариантов может быть привязать свойство rows к другому свойству в вашем компоненте. Затем установите это также в методе runReport(). –

Смежные вопросы