Предоставление кнопки редактирования и удаления для каждой строки таблицы с использованием тега отображения - PullRequest
1 голос
/ 19 декабря 2011

Я использую тег отображения для отображения данных в таблице на JSP (используя распорки 2). Теперь я хочу дать две ссылки для каждой строки, одну для редактирования и одну для удаления строки.

Моя структура jsp и то, что я сейчас пытаюсь:

<s:url id="editReport" action="editReport" />
<sd:div href="%{editReport}" listenTopics="editReport" formId="actionForm" showLoadingText="false" preload="false">
    <s:url id="updLists" action="updLists" />
    <sd:div href="%{updLists}" listenTopics="updLists" formId="enterDayReport" showLoadingText="false" preload="false">
        <s:form id="enterDayReport" action="enterDayReport">
            <sd:autocompleter  label="Customer " name="customer" list="customerList"  valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <sd:autocompleter  label="Contact "  name="contact"  list="contactList"   valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <s:select          label="Stage "    name="stage"    list="stageList"     headerKey="0" headerValue="Select" />
            <s:select          label="Type "     name="type"     list="typeList"      headerKey="0" headerValue="Select" />
            <sd:datetimepicker label="Date"      name="date"     formatLength="small" displayFormat="dd - MMM - yyyy"/>
            <s:textarea        label="Summary"   name="summary"  cols="40" rows="10"/>
            <s:submit          value="Save Report"/>
        </s:form>
    </sd:div>
</sd:div>

<s:url id="deleteReport" action="deleteReport" />
<sd:div href="%{deleteReport}" listenTopics="deleteReport" formId="actionForm" showLoadingText="false" preload="false">
    <disp:table name="dayReportsList" export="true" class="dataTable">
        <disp:column property="contactCode" title="Contact"/>
        <disp:column property="customerCode" title="Customer"/>
        <disp:column property="stage" title="Stage"/>
        <disp:column property="type" title="Type"/>
        <disp:column property="summary" title="Summary"/>
        <disp:column property="reportDate" title="Date" format="{0,date,dd-MMM-yyyy}" />
        <disp:column property="rowId" href="%{editReport}" paramId="rowID" paramProperty="rowId" title="Action">
            <s:form id="actionForm" name="actionForm">
                <s:hidden id="rowId" name="rowId" value="%{rowId}"/>  // This is not getting populated.
                <s:a onclick="dojo.event.topic.publish('editReport')">Edit<s:property value="rowId"/></s:a><br>
                <s:a onclick="dojo.event.topic.publish('deleteReport')">Delete</s:a>
            </s:form>
        </disp:column>
    </disp:table>
</sd:div>

Проблема, с которой я здесь сталкиваюсь, заключается в том, что name формы, связанной с каждой строкой в ​​теге отображения, одинаковы. Поэтому, когда я пытаюсь получить доступ к переменной rowId в своем классе действий, я получаю значение только для rowId первой строки, независимо от того, какая кнопка строки нажата.

Я видел несколько примеров переполнения стека и Google, которые используют перезапись URL, но я не хочу использовать это.

Пожалуйста, сообщите.

Спасибо !!

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Я думаю, что все сводится к тому, как вы публикуете события, используя додзё.Я не очень хорошо знаю, как работает додзё, но ваши кнопки работают

dojo.event.topic.publish('editReport')

, поэтому я не вижу, как подписчик на событие "editReport" мог узнать, какую строку вы пытаетесь удалить, итаким образом, какую строку он должен удалить.

Документация для публикации показывает, что аргумент может быть передан в функцию публикации.Передайте rowId в качестве аргумента функции подписки и используйте этот аргумент в функции редактирования / удаления строки.

Редактировать:

Конец страницы http://struts.apache.org/2.1.8/docs/ajax-div-template.html показываетпример, который динамически изменяет HREF div, а затем обновляет div.Я бы использовал аналогичную стратегию: иметь уникальную форму (а не одну форму на строку) для редактирования (или удаления) отчета на вашей странице.Пусть каждая ссылка строки публикует событие в теме с идентификатором строки в качестве аргумента.Пусть функция JavaScript, слушающая тему, динамически изменяет значение скрытого поля rowId уникальной формы, а затем сообщает div, чтобы он обновился сам.

0 голосов
/ 21 декабря 2011

Для тех, кто все еще застрял на том, что должно быть сделано, вот что я наконец-то сделал, чтобы заставить его работать.

JSP:

<s:url id="editReport" action="editReport" />
<sd:div href="%{editReport}" listenTopics="editReport" formId="actionForm" showLoadingText="false" preload="false">
    <s:url id="updLists" action="updLists" />
    <sd:div href="%{updLists}" listenTopics="updLists" formId="enterDayReport" showLoadingText="false" preload="false">
        <s:form id="enterDayReport" action="enterDayReport">
            <sd:autocompleter  label="Customer " name="customer" list="customerList"  valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <sd:autocompleter  label="Contact "  name="contact"  list="contactList"   valueNotifyTopics="updLists" autoComplete="false" searchType="substring"/>
            <s:select          label="Stage "    name="stage"    list="stageList"     headerKey="0" headerValue="Select" />
            <s:select          label="Type "     name="type"     list="typeList"      headerKey="0" headerValue="Select" />
            <sd:datetimepicker label="Date"      name="date"     formatLength="small" displayFormat="dd - MMM - yyyy"/>
            <s:textarea        label="Summary"   name="summary"  cols="40" rows="10"/>
            <s:hidden          id="filedOnDate"  name="filedOnDate"/>
            <s:submit          value="Save Report"/>
        </s:form>
    </sd:div>
</sd:div>

<s:url id="deleteReport" action="deleteReport" />
<sd:div href="%{deleteReport}" listenTopics="deleteReport" formId="actionForm"  showLoadingText="false" refreshOnShow="true" preload="false">
    <s:form id="actionForm" name="actionForm" action="">
        <disp:table uid="dayReport" name="dayReportsList" export="true" class="dataTable">
            <disp:column property="contactCode" title="Contact"/>
            <disp:column property="customerCode" title="Customer"/>
            <disp:column property="stage" title="Stage"/>
            <disp:column property="type" title="Type"/>
            <disp:column property="summary" title="Summary"/>
            <disp:column property="reportDate" title="Date" format="{0,date,dd-MMM-yyyy}" />
            <disp:column title="Action">
                <s:a href="" onclick="editEvent(event,%{#attr.dayReport.rowId});">Edit</s:a><br>
                <s:a href="" onclick="deleteEvent(event,%{#attr.dayReport.rowId});">Delete</s:a>
            </disp:column>
        </disp:table>
        <s:hidden id="rowId" name="rowId"/>
    </s:form>
</sd:div>

Файл JS:

function editEvent(e,rowId)
{
    dojo.byId('rowId').value=rowId;
    dojo.event.topic.publish('editReport');
}

function deleteEvent(e,rowId)
{
    dojo.byId('rowId').value=rowId;
    dojo.event.topic.publish('deleteReport');
}

Это то, что происходит здесь:

При нажатии на правку или удаление вызывается соответствующая функция в js (и передается rowId).Каждая функция сначала устанавливает значение скрытого поля равным значению rowId (которое является параметром для функции), а затем наказывает за тему.Когда тема опубликована, соответствующий div вызывает действие и обновляется новым содержимым.Здесь я упомянул идентификатор формы в теге div, так что у действия есть значение скрытого поля, для которого в javascript было установлено значение rowId.

Надеюсь, это поможет

Kanishk

...