XForms/尾部插入和删除
外观
< XForms
在某些情况下,您可能只想在列表末尾添加或从列表末尾删除。该程序演示了如何使用 last() 函数来实现这一点。

当您插入新行时,它将始终插入到列表的末尾。当您删除一行时,它也将从列表的末尾删除。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:ev="http://www.w3.org/2001/xml-events">
<head>
<title>Repeat Demo</title>
<xf:model>
<xf:instance xmlns="">
<data xmlns="">
<val>1</val>
<val>2</val>
<val>3</val>
</data>
</xf:instance>
</xf:model>
</head>
<body>
<xf:repeat nodeset="val">
<div>
<xf:output ref=".">
<xf:label>Value: </xf:label>
</xf:output>
</div>
</xf:repeat>
<xf:trigger>
<xf:label>Insert new row</xf:label>
<xf:action ev:event="DOMActivate">
<xf:insert nodeset="val" position="after" at="last()" />
<xf:setvalue ref="val[last()]" value="count(/data/val)" />
</xf:action>
</xf:trigger>
<xf:trigger>
<xf:label>Delete last row</xf:label>
<xf:delete nodeset="val" at="last()" ev:event="DOMActivate" />
</xf:trigger>
</body>
</html>
请注意,xf:insert 使用 xf:action 元素在 DOM 激活时触发,而 xf:delete 使用 ev:event 属性来触发删除。这是因为我们需要在插入中包含 xf:setvalue。
因此,作为一般规则,如果您只需要在触发器中使用单个元素,则可以使用 ev:event 属性。但如果您需要包含多个必须全部触发的元素,则应将它们包装在 xf:action 元素中。
潜在问题:当您删除所有节点时,插入触发器将不再起作用。这是因为在这种情况下,插入元素上的节点集选择为空。如果节点集选择器为空,则插入触发器毫无意义(参见 '插入处理规则' 中的第一条规则)。