2017-01-05 17 views
0

Я работаю с данными данных. Я хочу дать пользователю возможность удалять и редактировать строку inline (столбец с корзиной и значок редактирования). Когда пользователь хочет удалить, мне требуется пользовательское подтверждение на стороне клиента. Если они нажмут «да», я хочу отправить на сервер и удалить строку.Удаление строки DataTable с клиентской стороны с сообщением о подтверждении в XPages/JSF

У меня это работает без подтверждения, как это, потому что я нахожусь в контексте <datatable />:

<xp:button styleClass="btn red" 
      value="Delete" 
      id="btnConfirmDelete"> 

    <xp:eventHandler event="onclick" 
        submit="true" 
        refreshMode="partial" 
        refreshId="dataTable" 
        disableValidators="true"> 

     <xp:this.parameters> 
      <xp:parameter name="rowIndex" 
       value="#{rowIndex}"> 
      </xp:parameter> 
     </xp:this.parameters> 

     <xp:this.actionListeners> 
      <xp:actionListener type="com.domain.thing.listeners.deleteItemListener"> 
      </xp:actionListener> 
     </xp:this.actionListeners> 
    </xp:eventHandler> 
</xp:button> 

Эта кнопка находится в повторном панели. Каждый индекс строки применяется EL "#{rowIndex}".

Он отлично работает.

Теперь мне нужно ввести пользовательское подтверждающее сообщение.

Поэтому я заменил эту кнопку <a />, чтобы запустить диалоговое окно удаления ... и переместил кнопку удаления, уже работающую в диалоговом окне. Проблема сейчас, я потерял "#{rowIndex}". Вместо этого я использую настраиваемое свойство, чтобы установить значение в DOM.

Проблема, с которой я столкнулась, заключается в извлечении этого значения в слушателе com.domain.thing.listeners.deleteItemListener через параметры.

я настроил код вроде этого:

<xp:eventHandler event="onclick" 
       submit="true" 
       refreshMode="partial" 
       refreshId="demurrageDataTable" 
       onStart="XSP.setSubmitValue(window.dataTableRowDelete); alert('row is ' + XSP.getSubmitValue());" 
       onError="alert('onError: There was an error with the request.');" 
       disableValidators="true"> 

    <xp:this.parameters> 
     <xp:parameter name="rowIndex" 
         value="#javascript:context.getSubmittedValue();}"> 
     </xp:parameter> 
    </xp:this.parameters> 
    <xp:this.actionListeners> 
     <xp:actionListener type="com.canalbarge.trak.listeners.deleteDemurrageItemListener"> 
     </xp:actionListener> 
    </xp:this.actionListeners> 
</xp:eventHandler> 

OnStart я получаю RowIndex, который был установлен на запуск диалога. Когда срабатывает предупреждение, отображается правильное значение rowIndex.

На стороне сервера в слушателе событий есть исключение, поскольку p.getValue() всегда является пустой строкой "".

XspEventHandler eventHandler = (XspEventHandler) event.getSource(); 
List<Parameter> params = eventHandler.getParameters(); 
System.out.println(btnName + "checking event params"); 

if(params != null){ 
    for (Parameter p : params) { 
     System.out.println(btnName + p.getName() + "," + p.getValue()); 
     if(p.getName().equals("rowIndex")){ 
      rowIndex = Integer.parseInt(p.getValue()); 
     } 
    } 
} 
else{ 
    System.out.println(btnName + "params is null."); 
} 

ответ

1

Мой типичный подход к такого рода вещи - кнопка в повторе, запускающее диалог, то действующий на строке на стороне сервера, когда диалог будет закрыт - это сохранить ссылку на элемент повтора в viewScope. Возможно, что передача его в xp:inputHidden будет работать и может быть выполнена через CSJS, поэтому не используйте SSJS для запуска диалога.

0

Определите сценарий на стороне клиента этого события с удалением return confirm("Are you sure?"); Это выполнит скрипт SSJS, только если пользователь нажал кнопку «Да».

+0

Я не могу использовать функцию подтверждения браузеров. Я должен использовать настраиваемое диалоговое окно. – xpagesbeast

0

Решение в моих комментариях. При щелчке по значку редактирования строки вам нужно установить rowIndex. В моем случае я использую представленную переменную значения. Как указал Пол Стефанс Уизерс, вы можете использовать одну из переменных с областью. Во всех случаях сохраните rowIndex в одной из переменных карты приложения, и когда ваш диалог будет выполнен, вам нужно использовать это значение переменной.