【问题标题】:How to display DataList item in Primefaces Dialog如何在 Primefaces 对话框中显示 DataList 项
【发布时间】:2012-12-06 16:59:43
【问题描述】:

当单击 DataList 中的 SelectBooleanCheckbox 时,我需要能够显示一个引用当前项的对话框。在对列表进行分页时,我似乎无法在 valueChange 上传递当前项目/索引或保留当前项目的记录。要么对我有用。有人可以帮忙吗?

谢谢 :) 尼尔

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    如果您使用视图范围的 bean,这很容易。基本上,您只需将数据列表的当前项设置为 bean 的属性并更新应显示该项的对话框内容,然后打开对话框。假设对话框表示您希望在成功保存时关闭的编辑表单,那么您也希望使用新值更新数据列表。您可以为此使用<p:remoteCommand>。当然也可以将数据列表的客户端 ID 添加到对话框中命令按钮的update 属性中,但是在出现验证错误时就没有必要了。

    这是一个具体的启动示例:

    <h:form>
        <p:dataList id="list" value="#{bean.items}" var="item">
            #{item.id} #{item.value}
            <p:commandButton value="edit" 
                action="#{bean.setItem(item)}" 
                update=":editForm" 
                oncomplete="editDialog.show()" />
        </p:dataList>
        <p:remoteCommand name="updateList" update="list" />
    </h:form>
    <p:dialog widgetVar="editDialog">
        <h:form id="editForm">
            <p:messages autoUpdate="true" />
            <h:inputText value="#{bean.item.value}" required="true" />
            <p:commandButton value="save" 
                action="#{bean.save}" 
                oncomplete="if (!args.validationFailed) { editDialog.hide(); updateList(); }" />
        </h:form>
    </p:dialog>
    

    用这个 bean:

    @ManagedBean
    @ViewScoped
    public class Bean implements Serializable {
    
        private List<Item> items;
        private Item item;
    
        @EJB
        private ItemService service;
    
        @PostConstruct
        public void loadItems() {
            items = service.list();
        }
    
        public void save() {
            service.save(item);
            loadItems();
        }
    
        public List<Item> getItems() {
            return items;
        }
    
        public Item getItem() {
            return item;
        }
    
        public void setItem(Item item) {
            this.item = item;
        }
    
    }
    

    【讨论】:

    • 感谢您的回复 :)。之所以如此,是因为您能够通过该操作传递参数,但是当检查了SelectBooleanCheckbox(但未受过检查)时,我需要弹出对话框,因此我只有一个听众可以进行操作。在这种情况下有什么方法可以做类似的事情吗?
    • 你可以在里面嵌套一个&lt;p:ajax&gt;。它还提供了一个oncomplete 属性(使用标准JSF &lt;f:ajax&gt; 你必须摆弄onevent 属性)。
    • 我已经有一个需要当前项目的侦听器。 bean.setItem() 会在哪里/何时被调用? oncomplete 为时已晚。
    • 就在监听器方法中。请注意,oncomplete 不执行 bean 方法,而是执行 JavaScript 代码,因此您的“为时已晚”参数没有意义。
    • 对不起 - 我误解了。我已经使用 oncomplete 有条件地弹出对话框(就像您的建议一样),但是侦听器已经需要设置“项目”来确定对话框是否应该弹出。当您说 setItem() 在“侦听器方法”中被调用时,我如何设置“项目”。对不起-现在感觉很愚蠢:)
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    相关资源
    最近更新 更多