Frage

Ich habe ein Problem mit einer einfachen Anwendung in JSF 2.0.

ich versuche, eine ToDo-Liste mit AJAX-Unterstützung zu bauen. Ich habe einige todo Strings, die ich ein Datatable-Display. Innerhalb dieser Datentabelle habe ich ein command eine Aufgabe zu löschen. Das Problem ist jetzt, dass die Datentabelle nicht bekommen, neu gerendert.

    <h:dataTable id="todoList" value="#{todoController.todos}" var="todo">
        <h:column>
                <h:commandLink value="X" action="#{todoController.removeTodo(todo)}">
                    <f:ajax execute="@this" render="todoList" />
                </h:commandLink>
        </h:column>
        <h:column>
            <h:outputText value="#{todo}"/>
        </h:column>
    </h:dataTable>

Danke für Ihre Hilfe.

Edit (TodoController):

@ManagedBean
@SessionScoped
public class TodoController {

private String todoStr;
private ArrayList<String> todos;

public TodoController() {
    todoStr="";
    todos = new ArrayList<String>();
}

public void addTodo() {
    todos.add(todoStr);
}

public void removeTodo(String deleteTodo) {
    todos.remove(deleteTodo);
}

/* getter / setter */
}
War es hilfreich?

Lösung

(Sieht aus wie ich nicht genug Ruf anderer Antworten zu äußern haben)

ich denke FRotthowe schlägt die Tabelle mit einem anderen Element Einwickeln und Referenzierung es absolute Referenz verwendet wird (dh der Benennung der alle übergeordneten Container von der Wurzel des Dokuments.) Aus dem . Tag

So etwas wie folgt aus:

<h:form id="form">
    <h:panelGroup id ="wrapper">
        <h:dataTable value="#{backingBean.data}" var="list">
            <h:column>
                <h:commandButton value="-" action="#{backingBean.data}">
                    <f:ajax render=":form:wrapper"/>
                </h:commandButton>
            </h:column>
    </h:dataTable>
    </h:panelGroup>
</h:form>

Aber absolute Referenzen verwendet, ist immer eine Quelle von Problemen und steigt exponentiell die Refactoring Zeit wie die Ansicht wächst.

Gibt es nicht eine Möglichkeit, nur die Tabelle zu rendern, von einem -Tag (verhindern JSF aus der Addition dieser nervigen „: number_of_row“ in dem Ajax-Ereignisse)?

Andere Tipps

Ich gehe davon aus, dass die ? wird durch eine Form eingeschlossen

mit diesem Thema Nach dem Kampf für eine Weile gegoogelt ich eine einfache und saubere Lösung: add @form machen Attribut von und voila!

Voll Beispiel:

<h:form id="theForm">
    <h:dataTable id="table" value="#{tasksMgr.allTasks}" var="task">

        <h:column>
           #{task.name}
        </h:column>

        <h:column>
            <h:commandButton id="removeTaskButton" value="X" action="#{tasksMgr.removeTask(task)}">
                <f:ajax render="@form" />
            </h:commandButton>
        </h:column>
    </h:dataTable>
</h:form>

Der vollständige Artikel, die mir geholfen, ist hier: http://blogs.steeplesoft.com/2009/10/jsf-2-hdatatable-and-ajax-updates/

Mit diesem Code:

<h:form id="form">
<h:panelGroup id="panel">
    <h:dataTable id="todoList" value="#{todoController.todos}" var="todo">
        <h:column>
                <h:commandLink value="X" action="#{todoController.removeTodo(todo)}">
                    <f:ajax render=":form:panel" />
                </h:commandLink>
        </h:column>
        <h:column>
            <h:outputText value="#{todo}"/>
        </h:column>
    </h:dataTable>
</h:panelGroup>
</h:form>

Ich lief in das gleiche Problem und dachte, wenn Sie ein Element setzen (z) um den Tisch herum und rerender, dass es funktionieren wird. Ich bin aber nicht ganz sicher, warum das so ist. Anyone?

Aus irgendeinem Grund JSF ist die ID im Modifizieren-Tag in der Taste. Wenn ich schreibe diese xhtml:

<h:form id="form">
    <h:commandButton value="Button">
        <f:ajax render="table"/>
    </h:commandButton>

    <h:dataTable id="table" value="#{tableData.data}">
        <h:column>
            <h:commandButton value="Button">
                <f:ajax render="tocoto"/>
            </h:commandButton>
        </h:column>
    </h:dataTable>
</h:form>

ich diese HTML:

<form id="j_idt7" name="j_idt7" method="post" action="/WebApplication1/faces/index.xhtml" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="j_idt7" value="j_idt7" />
    <input id="j_idt7:j_idt8" type="submit" name="j_idt7:j_idt8" value="Button" onclick="mojarra.ab(this,event,'action',0,'j_idt7:table');return false" />

    <table id="j_idt7:table"><tbody>
        <tr>
            <td><input id="j_idt7:table:0:j_idt10" type="submit" name="j_idt7:table:0:j_idt10" value="Button" onclick="mojarra.ab(this,event,'action',0,'j_idt7:table:0');return false" /></td>
        </tr>
    </tbody></table>

     <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="-7634557012794378167:1020265910811114103" autocomplete="off" />
</form>

Beachten Sie, dass die ID in der zweiten Taste ‚j_idt7: Tabelle: 0‘, während ich erwarte zu bekommen. ‚J_idt7: Tisch‘, wie ich in dem ersten tun

Das ist nicht das Problem lösen, sondern kann eine Abhilfe finden helfen.

Sie müssen prependId = "false", um Ihre h hinzuzufügen: Form

Ich lief in das gleiche Problem.

Eine Sache, die „Werke“ ist das Hinzufügen von Richfaces zu einem Projekt und ersetzt die

h:datatable 

durch ein

rich:datatable. 

Welche die richtige Ids erzeugen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top