В моем бэк-бэне у меня есть список, который привязан к datatable. Мне нужно получить данные списка (называемые маршрутами) внутри внешнего javascript.
Поддержка боба
@Component("routeBean")
@Scope("session")
public class RouteBean {
List<RouteModel> routes;
private RouteModel routeModel;
public List<RouteModel> getRoutes() {
return routes;
}
public void setRoutes(List<RouteModel> routes) {
this.routes = routes;
}
public void addToList(){
routes.add(getRouteModel());
setRouteModel(new RouteModel());
}
public RouteModel getRouteModel() {
return routeModel;
}
public void setRouteModel(RouteModel routeModel) {
this.routeModel = routeModel;
}
.......................
}
Jsf
<p:fieldset legend="routeFieldset">
<p:inputText id="txtKm" value="#{routeBean.routeModel.km}"/><br/>
<p:commandButton value="Route Toevoegen" id="btnSaveRoute"
action="#{routeBean.addToList}"
update="routeListPanelGroup"
oncomplete="showBeanData()"/> <!-- this will execute the javascript method and show the data -->
</p:fieldset>
<p:fieldset legend="Routelijst">
<h:panelGroup id="routeListPanelGroup">
<p:dataTable value="#{routeBean.routes}"
var="route" id="routeListDTable"
widgetVar="routeWidget">
<p:column headerText="Id">
<h:outputText value="#{route.id}"/>
</p:column>
<p:column headerText="Km">
<h:outputText value="#{route.km}"/>
</p:column>
</p:dataTable>
</h:panelGroup>
</p:fieldset>
.......................
Внешний Javascript
function showBeanData(){
alert(backing bean data -> routes); //??????
}
Таким образом, когда пользователь нажимает на "btnSaveRoute", новый объект добавляется в список " маршруты " (это отлично работает). И после этого метод javascript должен получить мне " маршруты " внутри внешнего javascript без использования скрытых полей?
Примечание. Я использую сетки
Прочитайте документацию PrimeFaces на RequestContext
. Витрина здесь.
В принципе, идея состоит в том, что вы можете отправлять данные из вашего бэкэнбона на клиентскую сторону, используя метод #RequestContext.addCallbackParam()
. На стороне клиента выполните handleComplete(xhr, status, args)
в oncomplete
и получите данные из args
.
RequestContext.getCurrentInstance().addCallbackParam("routes", routes);
, в JavaScriptfunction handleComplete(xhr, status, args) { alert(args.routes.toSource()); }
, в jsf в commandButtononcomplete="handleComplete(xhr, status, args)"
. Я получаю ({empty: false}) как результат с помощью JavaScript. Не могли бы вы показать это на моих кодах?routes
возвращаются как объект JSON. Например, если вы возвращаете объектUser
со свойствомFirstname
, в JavaScript вы можете получить имя с помощьюargs.user.firstname
. Если я не ошибаюсь, функцияtoSource()
- это функция, которую вы написали на стороне сервера. Следовательно, клиентская сторона не может знать, как ее выполнить. Просто поиграйте с этим некоторое время. Я думаю, вы в конце концов поймете, как получить данные списка изargs.routes
. Попробуйтеalert(args.routes)
чтобы подтвердить, что данные есть.