当前位置: 首页 > 知识库问答 >
问题:

JSF PrimeFaces inputText IndataTable内部

邢令
2023-03-14

JSF-2.0、Mojarra 2.1.19、PrimeFaces 3.4.1

问题摘要:在p:dataTable内部有一个p:inputTextp:remoteCommand激发的inputText操作,该操作使用f:setPropertyActionListener将dataTable行索引作为参数传递。但它总是传递dataTable的最后一行,而不是包含当前单击的p:inputtext的行的索引。

从我前面的问题中可以看出,我正在尝试使用p:inputtext作为一个状态的注释接受者,比如在Facebook等中。实现包括一个p:dataTable。它的行代表每种状态。好像是:

<p:dataTable id="dataTable" value="#{statusBean.statusList}" var="status"
                     rowIndexVar="indexStatusList">
    <p:column>
        <p:panel id="statusRepeatPanel">
            <p:remoteCommand name="test" action="#{statusBean.insertComment}"
                update="statusRepeatPanel">
                <f:setPropertyActionListener 
                    target="#{statusBean.indexStatusList}"
                    value="#{indexStatusList}">
                </f:setPropertyActionListener>
            </p:remoteCommand>
            <p:inputText id="commentInput" value="#{statusBean.newComment}"
                onkeypress="if (event.keyCode == 13) { test(); return false; }">
            </p:inputText>
        </p:panel>
    </p:column>
</p:dataTable>

上面的代码说,当按enter键时,激发p:remoteCommand,它调用托管bean的insert方法。

@ManagedBean
@ViewScoped
public class StatusBean {
    List<Status> statusList = new ArrayList<Status>();
    public int indexStatusList;
    public String newComment
    //getters and setters
    public void insertComment() {
        long statusID = findStatusID(statusList.get(indexStatusList));
        statusDao.insert(this.newComment,statusID)
    }

让我们一起调试;假设p:dataTable中显示了三种状态,单击处于第二种状态(索引为1)的p:inputtext,键入“RELAX”并按enter键。

在调试控制台中,它正确地显示了“RELAX”,但它发现了错误的状态,因为IndexStatusList具有值2,该值属于p:StatusList中的最后一个状态。必须是1,它是单击dataTable行的p:inputtext的索引。

我认为问题是关于p:remoteCommand的,它使用屏幕上的最后一个索引。

它是如何运作的?

让我们假设有一个p:commandlink而不是p:remotecommandp:inputtext:

<p:commandLink action=#{statusBean.insertComment>
      <f:setPropertyActionListener target="#{statusBean.indexStatusList}"
          value="#{indexStatusList}"></f:setPropertyActionListener>

共有1个答案

吴驰
2023-03-14

此解决方案中的概念问题在于p:remoteCommand的工作方式。它创建JavaScript函数,其名称在p:remoteCommandname属性中定义。当您在dataTable中输入它时,它将迭代并创建名为test的JavaScript函数,其次数与表中的行数相同,最后一个行数只有一个。因此,解决方案可以在remoteCommand的名称处附加索引,但这是不好的,因为您会有许多不必要的JavaScript函数。更好的方法是创建一个函数,并将参数传递给它。因此在DataTable外部定义RemoteCommand:

<p:remoteCommand name="test" action="#{statusBean.insertComment}" update="statusRepeatPanel">

并在onkeypress事件中调用test函数,如下所示:

test([{ name: 'rowNumber', value: #{indexStatusList} }])

这将在AJAX请求中传递rownumber参数。在backking bean的insertcomment()方法中,您可以读取该参数并对其进行任何操作:

FacesContext context = FacesContext.getCurrentInstance();
Map map = context.getExternalContext().getRequestParameterMap();
Integer rowNumber = Integer.parseInt(map.get("rowNumber").toString());

注意:当您正在更新每一行中的面板时,也许您可以将remoteCommandupdate属性更改为@parent,这样,这将适用于所有行。

编辑:您可以在Java方法中用以下代码更新特定行中的特定面板:

RequestContext.getCurrentinstance().update("form:dataTable:" + rowNumber + ":statusRepeatPanel")
 类似资料:
  • 问题内容: 我想了解当CSS是CSS元素的DOM子元素(因此block元素是inline元素的子元素)时会发生什么情况。 CSS 2.1规范的“ 匿名块框”部分描述了这种情况:该示例包括以下规则… …以及随附的文字说… BODY元素包含一个匿名文本块(C1),然后是一个块级元素,然后是另一个匿名文本块(C2)。结果框将是围绕BODY的匿名阻止框,其中包含C1周围的匿名阻止框,P阻止框和C2周围包含

  • 实施可重用组件的各种工具。 函数 d3.functor(value) 如果参数value 是个函数,返回这个函数。否则,返回一个能够输出这个参数的函数变量。该方法用来将常量参数升级转换成函数,以备需要指定属性为常量或者函数的时候,直接实现。比如:许多D3 layouts需要指定属性成这种格式,当我们自动转换值到函数的时候,这样可以简化实现。 d3.rebind(target, source, na

  • 我最近需要在一个JScrollPane的viewport视图中放置几个组件,其中包括一个JTextPane。 我将所有组件(两个JPanel和JTextPane)放在另一个JPanel中,这个JPanel有一个BorderLayout LayoutManager,并将该JPanel设置为ScrollPane的viewport视图。 我立即注意到: JTextPane不再根据JScrollPane的

  • 问题内容: VS 哪种被认为是 正确的 (语法上)且性能最高的方法,为什么? 后一个示例中的语法对我来说似乎更合乎逻辑,但我的假设是JOIN会更快。 我看过查询计划,还无法从中解密任何内容。 查询计划1 查询计划2 问题答案: 两种语法有不同的用途。假设使用Join语法,则需要StockToCategory和Category表中的某些内容。如果每个类别的StockToCategory表中有多个条目

  • 在本章中,我们将讨论使用Socket.IO,事件和消息进行回退,连接。 Fallbacks Socket.IO有很多底层传输机制,它处理由于跨浏览器问题,WebSocket实现,防火墙,端口阻塞等引起的各种约束。 尽管W3C已经为WebSocket API定义了规范,但它仍然缺乏实现。 Socket.IO为我们提供了回退机制,可以处理这些问题。 如果我们使用本机API开发应用程序,我们必须自己实现

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 我有一个xml布局,它有以下视图:滚动视图->Relationvelayout->Some views+Tablayout+ViewPager->RecylerView(在ViewPager的片段中)。ViewPager有一些固定的高度(保持它“wrap_content”根本不会显示它)。现在的问题是Recylerview永远不会滚动。我已经尝试了几个已经发布的解决方案,比如在“嵌套滚动视图”中包

  • 我试图运行一个简单的mapdb示例,但出现了以下错误: 我的班级: 我的pomx.xml 我跑得很快-