سؤال

لدي مشكلة مع تطبيق بسيط في JSF 2.0.

أحاول بناء قائمة LODO مع دعم AJAX. لدي بعض سلاسل Lobo التي عرضها باستخدام DataTable. داخل DataTable، لدي CommandLink لحذف المهمة. المشكلة هي الآن أن DataTable لا يتم إعادة تقديمه.

    <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>

شكرا لمساعدتك.

تحرير (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 */
}
هل كانت مفيدة؟

المحلول

(يبدو أنني لا أملك سمعة كافية للتعليق على إجابات الآخرين)

أعتقد أن Frotthowe يوحي بتفويل الجدول مع عنصر آخر والرجوع إليه باستخدام المرجع المطلق (أي تسمية جميع حاويات الوالدين من أصل المستند) منu003Cf:ajax> بطاقة شعار.

شيء من هذا القبيل:

<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>

ولكن، فإن استخدام المراجع المطلقة هو دائما مصدر للمشاكل ويزيد بشكل كبير من وقت إعادة تكوينه حيث ينمو الرأي.

ليس هناك طريقة لتقديم الجدول فقط منu003Cf:ajax> علامة (منع JSF من إضافة تلك المزعجة ": number_of_row" في حدث AJAX)؟

نصائح أخرى

أفترض أن u003Ch:dataTable> مغلفة من قبل نموذج؟

بعد أن تكافح مع هذه القضية لفترة من الوقت، أنا غاضب حل سهل ونظيف: إضافة @شكل ل يقدم - يجعل سمة u003Cf:ajax> وفويلا!

مثال كامل:

<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>

المقال الكامل الذي ساعدني هنا: http://blogs.steeilesoft.com/2009/10/jsf-2-hdatatable-and-ajax-updates/

استخدم هذا الرمز:

<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>

ركضت في نفس المشكلة وحددت أنه إذا وضعت عنصر (على سبيل المثال) حول الجدول وريران، فسوف يعمل. ومع ذلك، لكنني ليس متأكدا تماما عن سبب ذلك بهذه الطريقة. أي واحد؟

لسبب ما يعدل JSF المعرف فيu003Cf:ajax> علامة في الزر. إذا كتبت هذا 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>

أحصل على هذا 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>

لاحظ أن المعرف في الزر الثاني هو "j_idt7: الجدول: 0" بينما أتوقع الحصول على "j_idt7: جدول" كما أقوم به في أول واحد.

هذا لا يحل المشكلة ولكن قد يساعد في العثور على الحل البديل.

تحتاج إلى إضافة الإعداد = "خطأ" إلى نموذج H:

وقعت في نفس المشكلة.

شيء واحد "يعمل" يضيف ريتشفات. إلى مشروعك، واستبدال

h:datatable 

بقلم

rich:datatable. 

والتي سوف تولد المعرف الصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top