primefaces datatable rowedit pas la mise à jour de cellule élément
J'ai un datatable avec rowedit.
Une colonne de ma table est une cellule avec une zone de liste dans, les éléments de la listbox sont récupérés dynamiquement (en fonction de la valeur d'une autre cellule)
J'utilise rowEditInit pour définir la selectedrow élément. Et je veux mettre à jour la liste pour récupérer les valeurs correctes.
Cela ne fonctionne pas.
Quand je fais
<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="orderitemstable" />
Puis quand je clique sur l'icône en forme de crayon, ce que je peux voir la ligne de basculer en mode d'édition et retriving la liste des éléments. Mais il directement swithced non le mode d'édition.
Mais quand je fais
<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="rmactionenumid" />
Puis en cliquant sur l'icône en forme de crayon met la ligne en mode édition, mais aucun appel n'est fait pour récupérer la liste des articles. Mon gues est, elle ne déclenche pas la mise à jour sur rmactionenumid.
Des idées?
Roel
Voici mon code jsf
<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="rmactionenumid" />
<p:column >
<p:cellEditor>
<f:facet name="output">
<h:outputText id="rmactionenumidlabel" value="#{orderItem.rmActionRepr}" >
</h:outputText>
</f:facet>
<f:facet name="input">
<h:selectOneListbox id="rmactionenumid" value="#{orderItem.rmActionEnumId}" size="1" valueChangeListener="#{workOrderDetail.setActionRepr}">
<f:selectItems value="#{workOrderDetail.actionItems}"/>
<p:ajax event="change" update="partdiscount,labourdiscount,totalprice,:detail:wodetail:totals" execute="@this" />
</h:selectOneListbox>
</f:facet>
</p:cellEditor>
</p:column>
<p:column >
<p:rowEditor id="edit" />
</p:commandLink>
</p:column>
</p:dataTable>
et voici mon java bean code
public List<SelectItem> getActionItems() throws MWSException {
ArrayList<SelectItem> actions = new ArrayList<SelectItem>();
if (getSelectedOrderItem() != null) {
ListManager lm = new ListManager(getWA().getMwsProxy());
MWSGenericMapList items = lm.nativeSearch(getWS().getUser(), HdfWebConstants.NS_VEHICLEPARTACTIONS, 0, 0, 200,
false, getSelectedOrderItem().getVehiclePartCode());
for (int i = 0; i < items.size(); i++) {
actions.add(new SelectItem(items.get(i).get("rmaction_enumid").toString(), items.get(i).get("rmaction")
.toString()));
}
}
return actions;
}
public void setSelectedOrderItem(IMWSOrderItem newSelectedOrderItem) throws MWSException {
this.selectedOrderItem = newSelectedOrderItem;
}
public void onEdit(RowEditEvent event) throws MWSException {
setSelectedOrderItem((IMWSOrderItem) event.getObject());
}
Je suis en utilisant PF3.5
valueChangeListener
et p:ajax
en même temps à selectOneListbox
? Vous avez beaucoup de code qui peut être de l'émission de votre fonctionnalité, par exemple, vous appelez onEdit
lorsque vous commencez le montage et quand vous avez fini. Est-il vraiment utile? En outre, vous avez posté deux colonnes avec un contenu similaire, je vous suggère d'essayer d'isoler le problème concret par vous-même. Si vous continuez toujours avec le problème, puis de le poster ici dans un préférable SSCCE style qui peut être copier-collé et de l'exécuter. Sinon, c'est si compliqué de voir la question concrète.J'ai enlevé un peu de code (pensé qu'il pourrait être utile, mais apparemment pas)
si j'ajoute un commandlink avec ajax mise à jour="rmactionenumid" et cliquez le modifier, puis de zone de liste s'affiche correctement (sans l'appel de la méthode d'haricot de nouveau)
OriginalL'auteur roel | 2014-01-03
Vous devez vous connecter pour publier un commentaire.
Il échoue parce que
update="rmactionenumid"
est dans cette construction par rapport à la table elle-même, et pas à l'actuelle ligne de la table.Fondamentalement, c'est la recherche d'un composant avec l'ID client
formId:tableId:rmactionenumid
au lieu de, par exemple, la deuxième ligneformId:tableId:1:rmactionenumid
. Techniquement, le<p:ajax>
doit être placé à l'intérieur de la<p:column>
, mais cela ne fonctionne pas pourrowEditInit
événement.Vous avez besoin pour composer votre propre
update
ID client basé sur leUIData
composant qui est disponible commeRowEditEvent
argument et ajouter le composé de l'IDENTIFIANT client àPartialViewContext#getRenderIds()
.Retirez la
<p:ajax update>
et de prolonger laonUpdate()
méthode comme suit:Vous êtes les bienvenus.
OriginalL'auteur BalusC
Le long des lignes de BalusC réponse:
Puisque vous êtes à l'aide de Primefaces 3.5 vous pouvez également faire usage de ses classes utilitaires ComponentUtils et RequestContext:
fera la même chose que l'extrait posté par BalusC.
OriginalL'auteur Neverland14
OMG il m'a fallu du temps pour comprendre ça. BalusC est comme toujours mort sur l'argent, mais de la chose qui a échappé à moi, c'était que la mise à jour d'un Datatable n'a pas de mise à jour de tous ses enfants comme je m'y attendais. La mise à jour de la table de fait une mise à jour des lignes (lignes supprimées dans le modèle sous-jacent à disparaître) et de réorganiser les lignes si le modèle sous-jacent a été réorganisé, mais les valeurs dans outputText widgets à l'intérieur CellEditor les récipients ne sont pas mis à jour, à l'exception de celui édité, sauf si vous fournissez un
<p:ajax />
balise à ceux que vous voulez mettre à jour, ce qui dans mon cas était tous d'entre eux. Je devine il y avait une conception de l'hypothèse que lorsqu'un CellEditor lancé un appel Ajax, le Datatable parent serait seulement de mettre à jour l'enfant de la cellule d'édition. Je n'ai jamais compris pourquoi un CellEditor besoin à la fois d'un InputText et un OutputText contenues dans le but de travailler.Cela a conduit à de douloureux problèmes pour moi lorsque plusieurs utilisateurs simultanément modifiés de la même Datatable dans les différentes sessions. UserA serait de faire une modification et d'obtenir un correctement mise à jour de la table, potentiellement avec les lignes dans un ordre différent. Ensuite, l'utilisateur b, dont la Datatable était maintenant hors de date, serait de faire un montage, et l'edit obtenir conservées dans la base de données correctement (parce que la ligne était unique, caché ID), mais le modifier serait aller à la mauvaise ligne dans la Datatable (mais la bonne colonne), et UserB, même après la mise à jour, ne serait pas voir UserA du changement dans une autre cellule. Une fois j'ai mis le
<p:ajax update="datatableID" />
balise dans le inputText corps, il a fonctionné correctement. J'ai toujours eu des problèmes de concurrence, que j'ai dû résoudre séparément, mais au moins la Datatable était correct après modifications.BalusC, si vous êtes là, merci de corriger mes mauvaises hypothèses ici.
OriginalL'auteur snakedog
Que j'ai rencontré le même problème. Ce que vous pouvez faire est la suivante:
Placer un objet logger en vertu de la méthode de mise à jour, (ou vous pouvez simplement écrire un système..println) pour vérifier si votre méthode est accessible à partir de jsf page. Si oui, vous écrire action.
Pour moi, j'ai vérifié si ma méthode est accessible. Et après, j'ai vu,ma ligne des dossiers n'a pas encore mis à jour. Ce que j'ai fait est de créer un nouvel objet de désiré-ligne en vertu de la méthode, et de copier le contenu de la ligne des valeurs de mon nouvel objet par des getters/setters. Et puis j'ai pu mettre à jour mon rang. De cette façon fonctionne pour moi.
OriginalL'auteur Ali Yucel Akgul
Il pourrait aider quelqu'un. J'ai eu un problème similaire et j'ai essayé toutes les choses possibles sur internet. Finalement, j'ai abandonné, mais accidentellement fixe plus tard. Le problème était que j'avais plusieurs < h:form> utilisé dans mon .xhtml et les changements n'ont pas été reproduites pour une raison quelconque.
Espérons que cela aide quelqu'un.
OriginalL'auteur Dalai Llama