2008-11-17 6 views
0

J'apprends xForms, mais apparemment pas assez bien parce que je ne peux pas comprendre pourquoi this code ne fonctionne pas.Qu'ai-je fait pour casser mon xForms?

Il analyse dans FF2 avec l'extension xForms mais ne rend pas les contrôles de formulaire. IE7 et X-Smiles me posent des problèmes différents, mais je ne suis pas sûr que ces problèmes soient dus à mes xForms ou à autre chose - jusqu'à ce que je l'utilise dans FF2, je ne peux pas vraiment le dire.

Répondre

2

Ce document contient une tonne de problèmes malheureusement, je vais parcourir chacun d'eux à son tour.

1) Le plus gros problème se produit à quelques reprises et semble provenir d'une certaine confusion entre le model et l'interface utilisateur. Les deux sont des bêtes entièrement séparées dans XForms, qui adhère au modèle de conception modèle-vue-contrôleur. Donc, vous devez vous rappeler que tout dans le model est entièrement séparé de tout dans l'interface utilisateur. La relation entre les deux est simplement que les contrôles de l'interface utilisateur peuvent se lier aux nœuds de données d'instance dans votre model s. Pratiquement, en termes de document, cela signifie que vos éléments select1 et repeat ne devraient pas être des enfants de model éléments. Seuls les éléments instance, bind et les éléments d'action peuvent être enfants de model. Vous utilisez plusieurs éléments model, ce qui est inutile dans une telle forme simple

2) (parce que chaque model peut contenir plusieurs instance s et bind s). La raison pour laquelle je signale ceci est parce que vous introduisez quelques pièges potentiels en utilisant plusieurs model s, qui sont mieux évités en collant à un model si possible. Par exemple, la fonction XPath instance ne fonctionnera pas entre model s, vous devez donc faire très attention aux dépendances de données entre eux. En outre, un contrôle d'interface utilisateur est actualisé en fonction de model il est lié à, ce qui m'a souvent causé des problèmes dans le passé lorsque les contrôles ne sont apparemment pas rafraîchissant sainement.

3) Vous avez essayé d'utiliser un élément repeat pour appliquer un enfant bind à plusieurs nœuds. Ceci est faux parce que repeat est un élément d'interface utilisateur, pas un élément de modèle. Toutefois, étant donné que bind prend un attribut nodeset au lieu d'un attribut ref, vous n'avez pas besoin du repeat du tout. Au lieu de cela, vous pouvez simplement faire ceci:

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

4) Sur un grand nombre de vos contrôles de l'interface utilisateur, vous spécifiez à la fois un attribut de liaison et un attribut ref. Ces attributs sont mutuellement exclusifs, car ils représentent différentes façons d'atteindre la même chose. L'attribut ref doit contenir XPath qui identifie un noeud de données d'instance auquel vous voulez lier le contrôle de l'interface utilisateur.L'attribut bind doit contenir l'identifiant d'un élément de liaison qui a été défini ailleurs (l'élément bind identifiera lui-même le noeud auquel le contrôle se lie dans ce cas, via son attribut nodeset). Ainsi, en utilisant les deux attributs sur le même contrôle d'interface utilisateur, vous vous contredisez.

5) Dans certains cas, vous avez tenté d'utiliser un attribut ref pour lier un contrôle à un autre élément de l'interface utilisateur. Les contrôles peuvent uniquement être liés aux données d'instance.

6) Vous avez un setvalue à l'intérieur d'un repeat que vous tentez d'invoquer lors de l'événement xforms-value-changed. Cet événement n'est pas distribué à l'élément repeat, donc votre setvalue ne sera jamais appelé. L'événement xforms-value-changed est distribué uniquement aux contrôles de formulaire de base, qui sont defined dans le XForms spec comme:

entrée

| secrète | textarea | sortie | télécharger | gamme | déclencheur | soumettre | select | select1

7) Un autre répondre à cette question mentionne que vous avez tort de mettre vos éléments model dans le corps du document. Malheureusement, je n'ai pas assez de réputation pour y faire des commentaires, mais je voulais simplement souligner que cette réponse est fausse. Bien qu'il soit devenu classique de placer les éléments model dans le document head, rien dans la spécification XForms ne le requiert. En fait, un processeur majeur XForms, Ubiquity XForms, nécessite en fait model d'être dans le document body, en raison des limitations du navigateur.

0

Vous ne devez pas placer vos modèles dans la section du corps. Au lieu de cela, toutes les définitions de modèle doivent figurer dans la section head. Comme c'est le cas actuellement, votre code n'est pas conforme aux normes et est très difficile à comprendre.

Xforms Wiki book est une bonne ressource pour apprendre les XForms.

+0

En fait, votre point de vue de ne pas mettre de modèle dans le corps n'est pas vrai. La spécification XForms est intentionnellement agnostique sur les détails du langage hôte et ne donne aucun mandat sur l'emplacement du modèle. En effet, une implémentation majeure de la spécification, Ubiquity XForms, exige en fait que les éléments du modèle soient présents dans le corps du document en raison des limitations du navigateur. –

0

Je vais ajouter que xf: le répète, xf: groupe, xf: entrée, ... ne peut pas être des enfants de xf: modèle

0

Un bon endroit pour commencer pourrait être un XForms validator. Ensuite, je vous recommande de commencer à partir d'un exemple de travail et d'ajouter votre code progressivement, pour observer quelle partie est défaillante.