JSF-2.0、Mojarra 2.1.19、PrimeFaces 3.4.1
问题摘要:在p:dataTable
内部有一个p:inputText
和p: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:remotecommand
和p:inputtext
:
<p:commandLink action=#{statusBean.insertComment>
<f:setPropertyActionListener target="#{statusBean.indexStatusList}"
value="#{indexStatusList}"></f:setPropertyActionListener>
此解决方案中的概念问题在于p:remoteCommand
的工作方式。它创建JavaScript函数,其名称在p:remoteCommand
的name
属性中定义。当您在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());
注意:当您正在更新每一行中的面板时,也许您可以将remoteCommand
的update
属性更改为@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 我跑得很快-