SORU
14 ŞUBAT 2011, PAZARTESİ


Nasıl dataTable içinde commandLink için seçili satır geçebilir miyim?

AKSARAY 2 Uygulama Primefaces kullanıyorum. ** 14, satır seçmek yerine, kullanıcı doğrudan tek bir satır üzerinde çeşitli eylemleri gerçekleştirmek için mümkün olmak istiyorum. Bunun için, son sütunda <p:commandLink>birkaç s var.

Benim sorunum: nasıl hareket biliyorum böylece eylem komut bağlantı ile başlayan bir satır NUMARASI geçebilir miyim? *16: kullanmaya çalıştım

<p:dataTable value="#{bean.items}" var="item">
    ...
    <p:column>
        <p:commandLink actionListener="#{bean.insert}" value="insert">
            <f:attribute name="id" value="#{item.id}" />
        </p:commandLink>
    </p:column>
</p:dataTable>

Ama her zaman 0 - f öznitelik işlenirken kullanılamaz satır görünüşe göre değişken (sabit bir değer kullandığımda çalışıyor) verir.

Kimse alternatif bir çözüm var mı?

CEVAP
14 ŞUBAT 2011, PAZARTESİ


Nedeni olarak, <f:attribute> bileşenin kendisi için özel (derleme zamanı sırasında görünümü nüfuslu), yinelenen satır (görünüm sırasında işlemek zaman doldurulur).

Bu şartı sağlamak için çeşitli yollar vardır.

  1. <f:param> kullanın. Bir istek parametresi ekler.

    <h:commandLink action="#{bean.insert}" value="insert">
        <f:param name="id" value="#{item.id}" />
    </h:commandLink>
    

    Eğer bean isteği, kapsamlı, AKSARAY @ManagedProperty ile durulayın

    @ManagedProperty(value="#{param.id}")
    private Long id; //  setter
    

    Ya eğer bean kapsamı daha geniş veya daha ince taneli doğrulama/dönüşüm istiyorsanız, hedef görünümü <f:viewParam> de f:viewParam vs @ManagedProperty bkz

    <f:viewParam name="id" value="#{bean.id}" required="true" />
    

    Her iki şekilde de, bu datamodel mutlaka formu (fasulye isteği kapsamlı olduğu için) korunmuş olması gerekmez avantajı vardır.


  2. <f:setPropertyActionListener> kullanın. Avantajı bu isteği bean isteği daha geniş bir kapsamı vardır zaman göster parametre kapsam erişmek için ihtiyacını ortadan kaldırır.

    <h:commandLink action="#{bean.insert}" value="insert">
        <f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
    </h:commandLink>
    

    İle birlikte

    private Long id; //  setter
    

    Özellik ile sadece mevcut olacak eylem yöntemi id. Bu datamodel formu isteği göndermek için korunur istiyor. En iyi görünüm @ViewScoped kapsamında fasulye koymak.


  3. Senin servletcontainer 3.0 / EL Sunucu uygulaması destekler 2.2, sadece yöntem değişken olarak geçirin. Bu da datamodel formu isteği göndermek için korunması gerekir. En iyi görünüm @ViewScoped kapsamında fasulye koymak.

    <h:commandLink action="#{bean.insert(item.id)}" value="insert" />
    

    İle birlikte

    public void insert(Long id) {
        // ...
    }
    

    Hatta tüm madde yazılamaz:

    <h:commandLink action="#{bean.insert(item)}" value="insert" />
    

    ile:

    public void insert(Item item) {
        // ...
    }
    

    Sunucu uygulaması 2.5 kaplar, bu ise bunu destekleyen bir EL uygulanmasını sağlarsanız aynı zamanda, JBoss EL gibidir. Yapılandırma ayrıntıları için this answer bkz.


  4. Bağlama sırayla öğeleri saran DataModel<E> yerine datatable değer.

    <h:dataTable value="#{bean.model}" var="item">
    

    ile

    private transient DataModel<Item> model;
    
    public DataModel<Item> getModel() {
        if (model == null) {
            model = new ListDataModel<Item>(items);
        }
        return model;
    }
    

    (transient yapma ve tembel alıcısı içinde başlatmasını DataModel beri kapsamlı fasulye Serializable) sağlamayan bir görünüm veya bir oturumda bu kullanırken zorunludur

    Sonra etrafta hiçbir OLUMSUZLUK tıklandığında komut bağlantı/düğmesi istek parametre adı dayalı satır belirler) geçmeden DataModel#getRowData() geçerli satır erişmek mümkün olacak.

    public void insert() {
        Item item = model.getRowData();
        Long id = item.getId();
        // ...
    }
    

    Bu da datamodel formu isteği göndermek için korunması gerekir. En iyi görünüm @ViewScoped kapsamında fasulye koymak.


  5. Program aracılığıyla mevcut #{item} değerlendirmek Application#evaluateExpressionGet() kullanabilirsiniz.

    public void insert() {
        FacesContext context = FacesContext.getCurrentInstance();
        Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
        Long id = item.getId();
        // ...
    }
    

Seçmek için hangi bir veya diğer başka amaçlar için daha fazla avantaj sağlayıp fonksiyonel gereksinimleri ve bağlıdır. Ben şahsen #2 #3 veya sunucu uygulaması 2.5 kapları desteklemek için de istediğin zaman, devam et.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • RayperEnglishKnight

    RayperEnglis

    24 Kasım 2008
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013