我怎么做才能打破我的xForms?

时间:2008-11-17 07:27:45

标签: xml xforms

我正在学习xForms,但显然不够好,因为我无法弄清楚为什么this code不起作用。

它在FF2中解析wFor xForms扩展但不呈现表单控件。 IE7和X-Smiles给我带来了不同的问题,但我不确定这些问题是因为我的xForms还是其他因素 - 直到我让它在FF2中运行我才能真正说出来。

4 个答案:

答案 0 :(得分:2)

不幸的是,本文件包含大量问题,我将依次详细介绍每一个问题。

1)最大的问题发生了几次,似乎源于model和UI之间的一些混淆。这两个在XForms中是完全独立的野兽,它们遵循模型 - 视图 - 控制器设计模式。所以你需要记住model中的所有内容都与UI中的所有内容完全分开。两者之间的关系只是UI控件可以绑定到model中的实例数据节点。实际上,就您的文档而言,这意味着您的select1repeat元素不应该是model元素的子元素。只有instancebind和操作元素可能是model的子项。

2)您正在使用多个model元素,这种形式是不必要的(因为每个model可能包含许多instancebind s。我之所以这样做的原因是因为你使用多个model引入了一些潜在的陷阱,最好在可能的情况下坚持使用model。例如,instance XPath函数在model之间不起作用,因此您必须非常小心它们之间的数据依赖性。此外,UI控件会根据绑定的model进行刷新,这在过去通常会导致我出现问题,因为控件显然没有明显提升。

3)您尝试使用repeat元素将子bind应用于多个节点。这是错误的,因为repeat是UI元素,而不是模型元素。但是,由于bind采用nodeset属性而不是ref属性,因此您根本不需要repeat。相反,你可以这样做:

<xf:bind nodeset="//want" readonly="true()" />

4)在许多UI控件上,您指定了bind属性和ref属性。这些属性是互斥的,因为它们代表了实现同一事物的不同方式。 ref属性应包含XPath,用于标识要将UI控件绑定到的实例数据节点。 bind属性应该包含已在别处定义的绑定元素的id(绑定元素本身将通过其nodeset属性标识控件在这种情况下绑定的节点)。因此,通过在同一UI控件上使用这两个属性,您自相矛盾。

5)在某些地方,您尝试使用ref属性将控件绑定到UI中的另一个元素。控件只能绑定到实例数据。

6)setvalue内有一个repeat,您试图在xforms-value-changed事件中调用它。此事件不会分发到repeat元素,因此永远不会调用setvaluexforms-value-changed事件仅发送到核心表单控件,defined中的XForms spec为:

输入|秘密| textarea的|输出|上传|范围|触发|提交|选择| SELECT1

7)这个问题的另一个答案提到你将model元素放在文档正文中是错误的。不幸的是,我没有足够的声誉在那里评论,但我只想指出答案实际上是错误的。尽管将model元素放在文档head中已经变得很常见,但XForms规范中没有任何内容要求这样做。实际上,由于浏览器的限制,一个主要的XForms处理器Ubiquity XForms实际上需要model位于文档body中。

答案 1 :(得分:0)

您不应将模型放在身体部分。相反,所有模型定义都应位于head部分。就像现在一样,您的代码不符合标准,并且很难理解。

Xforms Wiki book是学习XForms的好资源。

答案 2 :(得分:0)

我要补充说xf:repeat,xf:group,xf:input,...不能是xf的孩子:model

答案 3 :(得分:0)

一个好的起点可能是XForms validator。之后,我建议从一个工作示例开始,逐步添加代码,以观察哪个部分失败。