вызов ajax в jsf 2.0 (myfaces), функция onevent Javascript в теге ajax вызывается до завершения рендеринга
Я впервые задаю вопрос на форуме, так как обычно мои вопросы уже были заданы и даны ответы. Я не нашел ответ на эту проблему, который работает для меня, так что здесь идет:
Я делаю Ajax-вызов в JSF 2.0 следующим образом:
< f :ajax listener="#{myReferenceController.clearRequiredReferenceNumber}"
onevent="resetFocus" execute="@form"
render=":resultsForm:ResultsDisplay" />
Все в слушателе работает отлично, и затем данные отображаются так, как и ожидалось, в таблице данных, которая находится на моей странице .xhtml. Проблема в том, что Javascript, который я вызываю вonevent
кажется, вызывается до завершения рендеринга, и поэтому процесс сброса фокуса на столбец в моемdatatable
не работает, так какdatatable
удаляется, а затем снова добавляется в DOM, когда Ajax завершает повторный рендеринг.
Я ищу в своем Javascript статус «success» в надежде, что на этом этапе рендеринг будет завершен. Увы, это не тот случай, и мойgetElementById
(на самом делеdojo.byId
) не находит элемент в datatable. Я знаю, что моя функция Javascript работает в нормальных условиях, поскольку я вызываю эту же функцию в ситуации, когда нет вызова Ajax, и там все прекрасно работает.
Если бы я мог просто избежать рендеринга ячейки в таблице, на которую я пытаюсь установить фокус, это было бы замечательно, но мой слушатель вносит изменения в эту ячейку в вызове ajax. Я в своем уме, поэтому любые идеи по этому поводу были бы очень признательны.
- в ответ на Балуск (слышал о вас хорошие вещи, кстати)
Хм, я на самом деле был на правильном пути, я думаю, но все еще, кажется, возникают проблемы. Я проверяю на "успех" и все же даже в успехе, я не могу установить фокус здесь. Вот моя функция Javascript, которая проверяет «успех»: эта функция работает в другой ситуации, когда она не привязана к событию Ajax.
function resetFocus(data) {
var theRow = dojo.byId("resultsForm:selectedRow").value;
if (data.status == "success") {
dojo.query('[widgetId]',dojo.byId('theResultsDataTable'))
.forEach(function(node) {
var widget = dijit.byNode(node);
var theId = widget.attr("id")
if (theId.indexOf(':' + theRow + ':') != -1) {
if (theId.indexOf('theOrppoNum') != -1) {
widget.focus();
widget.attr("isFocused",true);
}
}
});
}
}