Wywołanie ajax w jsf 2.0 (myfaces), wywoływana jest funkcja onevent Javascript w znaczniku ajax przed zakończeniem renderowania
Po raz pierwszy zadaję pytanie na forum, ponieważ zazwyczaj moje pytania zostały już zadane i udzielone. Nie znalazłem odpowiedzi na ten problem, który dla mnie działa, więc tutaj:
Wykonuję wywołanie Ajax w JSF 2.0 w następujący sposób:
< f :ajax listener="#{myReferenceController.clearRequiredReferenceNumber}"
onevent="resetFocus" execute="@form"
render=":resultsForm:ResultsDisplay" />
Wszystko w słuchaczu działa doskonale, a dane są następnie renderowane zgodnie z oczekiwaniami w tabeli danych, którą mam na mojej stronie .xhtml. Problem polega na tym, że JavaScript, który wywołuję wonevent
wydaje się być wywoływane przed zakończeniem renderowania, a zatem proces resetowania fokusa do kolumny w moimdatatable
nie działa, ponieważdatatable
jest usuwany, a następnie ponownie dodawany do DOM, gdy Ajax kończy renderowanie.
W moim Javascript szukam statusu „sukcesu”, w nadziei, że w tym momencie renderowanie zakończy się. Niestety, tak nie jest i mojegetElementById
(tak właściwiedojo.byId
) nie znajduje elementu w datatable. Wiem, że moja funkcja JavaScript działa w normalnych okolicznościach, ponieważ wywoływam tę samą funkcję w sytuacji, gdy nie ma wywołania Ajax i wszystko działa tam doskonale.
Gdybym mógł po prostu uniknąć renderowania komórki w tabeli, do której próbuję ustawić fokus, byłoby świetnie, ale mój detektor dokonuje zmian w tej komórce w wywołaniu ajax. Jestem na wyczerpaniu, więc wszelkie pomysły na ten temat byłyby bardzo mile widziane.
- w odpowiedzi na Balusc (słyszałem o tobie dobre rzeczy, btw)
Hmm, właściwie byłem na dobrej drodze, myślę, ale wciąż wydaje mi się, że mam kłopoty. Sprawdzam „sukces” i nadal nawet w sukcesie, nie jestem w stanie skupić się tutaj. Oto moja funkcja Javascript, która sprawdza „sukces”: ta funkcja działa w innej sytuacji, w której nie jest dołączona do zdarzenia 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);
}
}
});
}
}