Передайте значение из h: outputLink в JSF после события onclick - PullRequest
1 голос
/ 27 августа 2011

Мне нужно передать целое число компоненту поддержки JSF после события onclick в h:outputLink.

Важно: Я не могу использовать f: param для передачи значения в качестве параметров запроса на навигационную страницу, так как я предотвращаю поведение по умолчанию при нажатии h: outputlink. Элемент управления вместо перехода на страницу, определенную атрибутом href, переходит к функции javascript .

Использование снимка Primefaces 3.0M3 с JSF 2.0


Мой код следующий:

<h:outputLink id="#{item.id}" value="/itemDetails.xhtml" class="itemLink" >
      #{item.name}
</h:outputLink>


<script>
$(".itemLink").click(function(event) {
  showDetailsInDialog();// show the item details in dialog 
  event.preventDefault();// prevent the behaviour provided by href
});
</script>


<h:form>
    <p:remoteCommand name="showDetailsInDialog" update="itemDetailsPanel" oncomplete="itemDetailsDialog.show()">
        <f:setPropertyActionListener value="....id of the item...." target="#{itemsList.selectedItem}"/>
    </p:remoteCommand>
</h:form>

У меня есть многоразовый dialog, который отображает детали предмета, выбранного из списка предметов. Для этого при нажатии h:outputLink для элемента идентификатор этого элемента должен быть передан в JSF для отображения соответствующего содержимого в dialog.

Как показано выше. Если я могу получить идентификатор элемента в remotecommand, я могу передать его соответствующему компоненту поддержки через setPropertyActionListener

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

Я думаю, вы должны использовать p:commandLink вместо h:outputLink следующим образом -

Вид -

<h:form>
    <p:commandLink value="#{item.name}" action="#{myBean.fetchItem()}" update="detailPanel" oncomplete="detailDlg.show();">
        <f:setPropertyActionListener target="#{myBean.itemId}" value="#{item.id}"/>
    </p:commandLink>
</h:form>

Боб -

@ManagedBean
@ViewScoped
public class MyBean {

    @ManagedProperty(value="#{itemStore}")
    private ItemStore itemStore;

    private int itemId; //getter/setter
    private Item item;  //getter/setter

    public void fetchItem() {
        this.item = this.itemStore.getItemWithId(this.itemId);
    }

Обновление:

Вы можете сделать это, используя JQuery следующим образом -

<script>
    jQuery(document).ready(function() {
            jQuery(".itemLink").click(function(event){
                jQuery("#itemIdHI").attr("value", jQuery(this).attr("id"));
                remCom();
                event.preventDefault();
            });
        });
</script>

<h:form prependId="false">
    <h:inputHidden id="itemIdHI" value="#{myBean.itemId}"/>
    <p:remoteCommand name="remCom" action="#{myBean.axnMethod()}" process="itemIdHI" update="detailPanel" oncomplete="detailDlg.show()"/>
</h:form>
0 голосов
/ 28 августа 2011

Проверьте это . У меня те же проблемы, что и у вас, но я решил их после прочтения ссылки BalusC .

Короче, вот о чем ты говоришь:

f: атрибут: с тегами h: commandLink и h: commandButton , вы также можете вызывать метод поддерживающего компонента, используя actionListener атрибут. При этом вы также можете использовать тег f: attribute для динамической передачи параметров. Вот пример:

<h:form>
    <h:commandLink value="Click here" actionListener="#{myBean.action}">
        <f:attribute name="attributeName1" value="attributeValue1" />
        <f:attribute name="attributeName2" value="attributeValue2" />
    </h:commandLink>

    <h:commandButton value="Press here" actionListener="#{myBean.action}">
        <f:attribute name="attributeName1" value="attributeValue1" />
        <f:attribute name="attributeName2" value="attributeValue2" />
    </h:commandButton>
</h:form>

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

package mypackage;

import javax.faces.event.ActionEvent;

import net.balusc.util.FacesUtil;

public class MyBean {

    // Actions -----------------------------------------------------------------------------------

    public void action(ActionEvent event) {
        String attributeName1 = FacesUtil.getActionAttribute(event, "attributeName1");
        String attributeName2 = FacesUtil.getActionAttribute(event, "attributeName2");

        System.out.println("attributeName1: " + attributeName1);
        System.out.println("attributeName1: " + attributeName1);
    }

}

package net.balusc.util;

import javax.faces.event.ActionEvent;

public class FacesUtil {

    // Getters -----------------------------------------------------------------------------------

    public static String getActionAttribute(ActionEvent event, String name) {
        return (String) event.getComponent().getAttributes().get(name);
    }

}

Переменные attributeName1 и attributeName2 теперь должны содержать значения attributeValue1 и attributeValue2 соответственно.

Позаботьтесь о том, чтобы каждое имя атрибута было уникальным и не переписывало какие-либо атрибуты компонента по умолчанию, такие как «id», «name», «value», «binding», «render» и т. Д.

...