0

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

它在带有 xForms 扩展的 FF2 中解析,但不呈现表单控件。IE7 和 X-Smiles 给我带来了不同的问题,但我不确定这些问题是因为我的 xForms 还是因为其他原因——直到我让它在 FF2 中工作之前我真的无法判断。

4

4 回答 4

2

不幸的是,该文档包含大量问题,我将依次逐一介绍。

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

2)您正在使用多个model元素,这在如此简单的形式中是不必要的(因为每个元素model可能包含许多instances 和binds)。我标记这个的原因是因为你通过使用多个models 引入了几个潜在的陷阱,最好通过尽可能坚持一个来避免model。例如,instanceXPath 函数不会跨models 工作,因此您必须非常小心它们之间的数据依赖关系。此外,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) 你有一个setvalueinside a repeat,你试图在xforms-value-changed事件上调用它。这个事件不会被分派给repeat元素,所以你setvalue永远不会被调用。该xforms-value-changed事件仅分派给核心表单控件,这些控件在XForms 规范中定义为:

输入|秘密|文本区域|输出|上传|范围|触发器|提交|选择|选择1

7)this question的另一个答案提到您将model元素放在文档正文中是错误的。不幸的是,我没有足够的声誉在那里发表评论,但我只是想指出答案实际上是错误的。尽管将model元素放在文档中已成为惯例head,但 XForms 规范中并没有强制要求这样做。事实上,由于浏览器的限制,一个主要的 XForms 处理器Ubiquity XForms实际上要求models 在 document中。body

于 2009-05-17T09:19:57.470 回答
0

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

Xforms Wiki 书是学习 XForms 的一个很好的资源。

于 2008-11-17T09:57:04.470 回答
0

我将添加 xf:repeat, xf:group, xf:input,... 不能是 xf:model 的子级

于 2008-11-17T20:44:33.960 回答
0

XForms 验证器是一个很好的起点。之后,我建议从一个工作示例开始,逐渐添加您的代码,以观察哪个部分失败。

于 2009-04-27T14:33:56.193 回答