我正在学习 xForms,但显然不够好,因为我无法弄清楚为什么这段代码不起作用。
它在带有 xForms 扩展的 FF2 中解析,但不呈现表单控件。IE7 和 X-Smiles 给我带来了不同的问题,但我不确定这些问题是因为我的 xForms 还是因为其他原因——直到我让它在 FF2 中工作之前我真的无法判断。
不幸的是,该文档包含大量问题,我将依次逐一介绍。
1) 最大的问题出现了几次,似乎源于model
UI 和 UI 之间的一些混淆。这两者在 XForms 中是完全独立的野兽,它遵循模型-视图-控制器设计模式。因此,您需要记住,其中的所有model
内容都与 UI 中的所有内容完全分开。两者的关系很简单,就是 UI 控件可能会绑定到你model
的 s 中的实例数据节点。实际上,就您的文档而言,这意味着您的select1
和repeat
元素不应该是元素的子model
元素。只有instance
和bind
动作元素可能是 的子元素model
。
2)您正在使用多个model
元素,这在如此简单的形式中是不必要的(因为每个元素model
可能包含许多instance
s 和bind
s)。我标记这个的原因是因为你通过使用多个model
s 引入了几个潜在的陷阱,最好通过尽可能坚持一个来避免model
。例如,instance
XPath 函数不会跨model
s 工作,因此您必须非常小心它们之间的数据依赖关系。此外,UI 控件会根据model
它所绑定的内容进行刷新,这在过去经常给我带来问题,因为控件显然不能正常刷新。
3) 您尝试使用一个repeat
元素将一个子元素应用于bind
许多节点。这是错误的,因为repeat
它是 UI 元素,而不是模型元素。但是,由于bind
采用nodeset
属性而不是ref
属性,因此您实际上根本不需要 a repeat
。相反,您可以这样做:
<xf:bind nodeset="//want" readonly="true()" />
4) 在您的许多 UI 控件上,您同时指定了 bind 属性和 ref 属性。这些属性是互斥的,因为它们代表实现同一事物的不同方式。ref 属性应包含标识要将 UI 控件绑定到的实例数据节点的 XPath。bind 属性应该包含已在别处定义的 bind 元素的 id(在这种情况下,bind 元素本身将通过其 nodeset 属性标识控件绑定到的节点)。因此,通过在同一个 UI 控件上使用这两个属性,您自相矛盾。
5) 在某些地方,您尝试使用 ref 属性将控件绑定到 UI 中的另一个元素。控件只能绑定到实例数据。
6) 你有一个setvalue
inside a repeat
,你试图在xforms-value-changed
事件上调用它。这个事件不会被分派给repeat
元素,所以你setvalue
永远不会被调用。该xforms-value-changed
事件仅分派给核心表单控件,这些控件在XForms 规范中定义为:
输入|秘密|文本区域|输出|上传|范围|触发器|提交|选择|选择1
7)this question的另一个答案提到您将model
元素放在文档正文中是错误的。不幸的是,我没有足够的声誉在那里发表评论,但我只是想指出答案实际上是错误的。尽管将model
元素放在文档中已成为惯例head
,但 XForms 规范中并没有强制要求这样做。事实上,由于浏览器的限制,一个主要的 XForms 处理器Ubiquity XForms实际上要求model
s 在 document中。body
你不应该把你的模型放在身体部分。相反,所有模型定义都应该在 head 部分。就像现在一样,您的代码不符合标准并且很难理解。
Xforms Wiki 书是学习 XForms 的一个很好的资源。
我将添加 xf:repeat, xf:group, xf:input,... 不能是 xf:model 的子级
XForms 验证器是一个很好的起点。之后,我建议从一个工作示例开始,逐渐添加您的代码,以观察哪个部分失败。