Проблема с навигацией в потоке задач
Я столкнулся с проблемой при навигации по потоку задач моего образца приложения. Я создал простой поток задач с тремя видами и методом, как показано ниже.
При входе в систему при нажатии кнопки "Отправить" я вызываю управляемый компонент bean "checkInput", который проверяет данные пользователя и переходит на указанную страницу jspx, т.е. метод возвращает соответствующее значение "admin" или "user" для перехода к следующему представлению в потоке задач. пока это не работает нормально.
Моя ситуация заключается в том, что я не хочу нажимать какие-либо кнопки, после ввода значения в текстовом поле и нажатия "Ввод" я хочу перейти к следующему представлению. Для этого я создал clientListener и serverListener и смог вызвать метод serverListener, и я реализовал поток навигация двумя способами
1) Вызов обработчика навигации, как описано ниже, как описано в ссылке: http://adfpractice-fedor.blogspot.in/2012/02/handling-key-modifiers-for-client.html
public void checkEnterEvent(ClientEvent clientEvent) {
HandleNavigation(clientEvent.getParameters().get("fvalue").toString());<-- passing parameter here
// HandleNavigation("admin"); <--even i hardcoded here for once
}
private void HandleNavigation(String outcome) {
System.out.println("IN HandleNavigation");
FacesContext context = FacesContext.getCurrentInstance();
NavigationHandler nh = context.getApplication().getNavigationHandler();
System.out.println(outcome);
nh.handleNavigation(context, null, outcome);
}
Это не сработало, а также это решение обходит жизненный цикл jsf, поэтому я реализовал это:
2) второстепенный путь:
public void checkEnterEvent(ClientEvent clientEvent) {
navigateByQueueAction();
}
private void navigateByQueueAction() {
FacesContext fctx = FacesContext.getCurrentInstance();
UIViewRoot root = fctx.getViewRoot();
//client Id of button includes naming container like id of region.
RichCommandButton button =
(RichCommandButton) root.findComponent("cb6");
ActionEvent actionEvent = new ActionEvent(button);
actionEvent.queue();
}
где "cb6" - это идентификатор командной кнопки в файле jspx <af:commandButton text="submit" action="check" id="cb6" visible="false">
но никто из них не работает.
Может кто-нибудь сказать, что не так с моим кодом?
1 ответ
В описанных выше сценариях я проигнорировал первый, поскольку он имеет недостатки, такие как обход жизненного цикла JSF. Переходя ко второму, я могу вызвать второе окно, нажав ввод на входном тексте, ставя в очередь действие кнопки программно. Теоретически я не знаю, как это решило проблему, и я уверен, что энтузиасты SO(ADF) будут рады услышать от экспертов ADF.
Как вы можете видеть (комментарий справа) в коде javascript в файле jspx, я изменил "немедленный" атрибут метода AdfCustomEvent.queue() на true, это решает мою проблему.
<af:resource type="javascript">
function handleEnterEvent(evt) {
var _keyCode = evt.getKeyCode();
//check for Enter Key
if (_keyCode == AdfKeyStroke.ENTER_KEY ){
var comp = evt.getSource();
var id=AdfPage.PAGE.findComponentByAbsoluteId('d1');
AdfCustomEvent.queue(id, "EnterEvent",{fvalue:comp.getSubmittedValue()},true); <-- changed from false to true.
evt.cancel();
}
}
</af:resource>
<af:serverListener type="keyboardToServerNotify"
method="#{backingBeanScope.JJS.handleKeyboardEvent}"/>
PS: я открыт для предложений.
Спасибо