操作 Xforms 重复集合。视图和模型很容易不同步

Posted

技术标签:

【中文标题】操作 Xforms 重复集合。视图和模型很容易不同步【英文标题】:Manipulating Xforms repeat collections. View and Model easily get out of sync 【发布时间】:2019-02-27 05:35:36 【问题描述】:

为了重现这个问题,这里有一些示例代码取自 Steve Pembertons Xforms for html authors tutorial。

随机点击几下新建和删除按钮后,UI 将冻结并停止响应进一步的点击,因为模型与视图不同步(即它们反映了不同数量的重复构造实例)

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?>
<?xsltforms-options debug="yes"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://www.w3.org/1999/xhtml"
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
<head>
	<title>To do</title>

	<style type="text/css">
	  body  font-family: sans-serif
	  label  display: inline-block; width: 3em; margin: 0 1em 
          .xforms-repeat-item-selected  background: yellow
	</style> 

	<xf:model>
   		<xf:instance src="todo.xml"/>
		<xf:instance id="template">
			<items xmlns="">
				<todo><task/><status>unstarted</status><date/></todo>
			</items>
		</xf:instance>
   		<xf:submission id="save" method="put" action="todo.xml" replace="none"/>
   		<xf:bind nodeset="todo/date" type="xsd:date"/>
	</xf:model>
</head>
<body>
    <xf:group>
	<xf:repeat nodeset="todo" id="todo-repeat">
	   <xf:input ref="date"><xf:label>Date</xf:label></xf:input>
	   <xf:select1 ref="status" selection="open">
	      <xf:label>Status</xf:label>
	      <xf:item><xf:label>Not started</xf:label><xf:value>unstarted</xf:value></xf:item>
	      <xf:item><xf:label>In Progress</xf:label><xf:value>started</xf:value></xf:item>
	      <xf:item><xf:label>Done</xf:label><xf:value>finished</xf:value></xf:item>
	   </xf:select1>
	   <xf:input ref="task"><xf:label>Task</xf:label></xf:input>
	   <xf:trigger>
	      <xf:label>Delete</xf:label>
	      <xf:delete ev:event="DOMActivate" nodeset="." at="1" />
	   </xf:trigger>
	</xf:repeat>
    </xf:group>
    <xf:trigger>
       <xf:label>New</xf:label>
       <xf:action ev:event="DOMActivate">
	    <xf:insert context="/items" origin="instance('template')/todo" nodeset="todo" position="after" at="count(todo)"/>
	    <xf:setvalue ref="todo[last()]/date" value="substring-before(now(), 'T')"/>
       </xf:action>
    </xf:trigger>
    <xf:submit submission="save"><xf:label>Save</xf:label></xf:submit>
</body>
</html>

【问题讨论】:

【参考方案1】:

此问题已被定位:这是由于对已删除的 HTML 对象的事件处理。实际上,删除最后一个重复项就足以重现它。之后,即使更改了 XLSTForms 引擎,仍然有可能执行一些 javascript 导致所有麻烦...

显然,这只发生在最近的 Chrome 版本中,并且 Javascript 源代码中的异常出现在控制台中,表明没有找到该事件的元素。

忽略那些僵尸事件听起来很棒!这已在所有最近的浏览器中成功测试,并将尽快提交。

-阿兰

【讨论】:

Alain 我不认为同步问题仅限于 Chrome,它不仅仅是删除最后一个重复项目的用例(实际上有时对我有用)。不过,我很乐意等待,看看下一个版本会出现什么。

以上是关于操作 Xforms 重复集合。视图和模型很容易不同步的主要内容,如果未能解决你的问题,请参考以下文章

MVC:数据模型和视图模型

从 XForms 操作调用 javascript

如何在集合视图中为不同的行实现不同的列数[重复]

模型属性未统一命名的主干集合和模板

如何使用 xforms:load 在 xforms 页面中嵌入 javascript 然后调用它?

在 XForms 的单独弹出窗口中插入和更新数据