我正在学习xForms,但显然不够好,因为我无法弄清楚为什么this code不起作用。
它在FF2中解析wFor xForms扩展但不呈现表单控件。 IE7和X-Smiles给我带来了不同的问题,但我不确定这些问题是因为我的xForms还是其他因素 - 直到我让它在FF2中运行我才能真正说出来。
答案 0 :(得分:2)
不幸的是,本文件包含大量问题,我将依次详细介绍每一个问题。
1)最大的问题发生了几次,似乎源于model
和UI之间的一些混淆。这两个在XForms中是完全独立的野兽,它们遵循模型 - 视图 - 控制器设计模式。所以你需要记住model
中的所有内容都与UI中的所有内容完全分开。两者之间的关系只是UI控件可以绑定到model
中的实例数据节点。实际上,就您的文档而言,这意味着您的select1
和repeat
元素不应该是model
元素的子元素。只有instance
,bind
和操作元素可能是model
的子项。
2)您正在使用多个model
元素,这种形式是不必要的(因为每个model
可能包含许多instance
和bind
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
元素,因此永远不会调用setvalue
。 xforms-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。之后,我建议从一个工作示例开始,逐步添加代码,以观察哪个部分失败。