2017-02-08 20 views
0

Primefaces 6.0. Я понимаю, что атрибут обновления p: remoteCommand должен использоваться для указания clientIds компонентов, которые должны быть обновлены AJAX. Я пытаюсь понять, как работает PF. В сочетании с DataTable он работает не так, как ожидалось. Когда я пытаюсь установить update="form:dataTable:2:bColumn", он не имеет никакого эффекта. Однако, делая это (прокомментированный в приведенном ниже коде) RequestContext.getCurrentInstance().update("form:dataTable:2:bColumn"); заставит PF обновить указанный выходной текст.Как обновить атрибут p: remoteCommand works

Почему это происходит? Я буду рад за техническое объяснение. Я пытаюсь найти ответ, отлаживая источники PF Java/Javascript.

<h:form id="form"> 
    <p:remoteCommand name="remoteCall" 
        action="#{grid4.onEdit}" 
        update="form:dataTable:2:bColumn" 
    /> 

    <p:dataTable id="dataTable" 
       var="gridItem" 
       value="#{grid4.gridItems}" 
       editable="true" editMode="cell" 
    > 

     <p:ajax event="cellEdit" 
       oncomplete="remoteCall()"> 
     </p:ajax> 

     <p:column headerText="A"> 
      <p:cellEditor> 
       <f:facet name="output"><h:outputText value="#{gridItem.a}" /></f:facet> 
       <f:facet name="input"><p:inputText value="#{gridItem.a}"/></f:facet> 
      </p:cellEditor> 
     </p:column> 
     <p:column headerText="B"> 
      <h:outputText id="bColumn" value="#{gridItem.b}" /> 
     </p:column> 
    </p:dataTable> 

</h:form> 

Bean

@ManagedBean 
@ViewScoped 
public class Grid4 { 
    private List<GridItem> gridItems = new ArrayList<>(); 


    public Grid4() { 
     gridItems.add(new GridItem("1", "a","b")); 
     gridItems.add(new GridItem("2", "a","b")); 
     gridItems.add(new GridItem("3", "a","b")); 
    } 

    public void onEdit() { 
     System.out.println("onEdit()"); 
     gridItems.get(2).setB("CHANGED VALUE"); 
//  RequestContext.getCurrentInstance().update("form:dataTable:2:bColumn"); 
    } 

    public List<GridItem> getGridItems() { 
     return gridItems; 
    } 

    public void setGridItems(List<GridItem> gridItems) { 
     this.gridItems = gridItems; 
    } 

} 

ответ

0

основном JSF идентификаторы бокового клиента идентификаторы две разных вещи (проверить this ответ и this почты для лучшего понимания).

При использовании RequestContext.getCurrentInstance().update("form:dataTable:2:bColumn"); этот метод используется идентификатор клиента, чтобы найти компоненты, которые должны быть обновлены, но в случае update имущества p:remoteCommand он ожидает Jsf идентификатор, а не сгенерированный идентификатор клиента, так that' поэтому ваше обновление не работает. Тем не менее, primefaces поддержка jquery selectors для обновления компонентов, так что вы могли бы использовать на стороне клиента идентификатор на update собственности как этот update="@(#yourElementId)"

0

Позвольте мне начать с упоминания, что это не является специфичным для p:remoteCommand. Причина того, что вы заметили, довольно проста, хотя это явно не очевидно, потому что, к сожалению, это не в документации PrimeFaces.

Атрибут обновления в:

<p:remoteCommand name="remoteCall" 
       action="#{grid4.onEdit}" 
       update="form:dataTable:2:bColumn" 
/> 

использует относительный путь, если он не начинается с: а так как p:remoteCommand уже в контейнере именования с id='form', формой в атрибуте обновления является излишней и даже делает его неработоспособным (запустите приложение в режиме dev, добавьте тег сообщений и увидите ошибки).

Так

<p:remoteCommand name="remoteCall" 
       action="#{grid4.onEdit}" 
       update="dataTable:2:bColumn" 
/> 

Должно работать, равно как и

<p:remoteCommand name="remoteCall" 
       action="#{grid4.onEdit}" 
       update=":form:dataTable:2:bColumn" 
/> 

RequestContext.getCurrentInstance().update("form:dataTable:2:bColumn"); 

является всегда абсолютным, поэтому двоеточие здесь не нужен, и он будет найти элемент, начинающийся с корня (требуется префикс формы)

+0

Решения, которые вы предоставили, не работают. После дополнительной отладки я узнал, что remoteCommand неправильно переводится в HTML. В сгенерированном HTML я могу видеть remoteCall = function() {PrimeFaces.ab ({s: "form: j_idt4", f: "form", u: "form: dataTable: bColumn", pa: arguments [0]}) ;}. Обратите внимание, что номер строки отсутствует. После отладки исходного кода PF он выглядит как ошибка. Код генерирует этот «clientId», сначала просматривая компонент (текстовое поле вывода). Но после того, как он находит это, есть некоторый побочный эффект, который сводит на нет поле clientId. –

+1

Это вопрос о separte. Значение атрибута обновления в вашем вопросе неверно в том, как я описываю в своем ответе. – Kukeltje