Résolution dynamique des chemins SOM XFA
L'exécution générale avec EnableJavaScript fournit le même résolveur de formulaire dynamique aux resolveNode/resolveNodes au niveau des nœuds, aux xfa.resolveNode/xfa.resolveNodes et aux accesseurs FormCalc
La résolution suit les occurrences répétées courantes immédiatement après insertion, suppression ou déplacement d'une instance ; les transactions runtime qui réussissent sauvegardent les écritures de champs sélectionnées vers leurs cibles de données natives et dans le XDP enregistré
Chemins et occurrences
| Chemin | Sélection |
|---|---|
row[1].cell | La deuxième ligne et sa cellule sélectionnée |
row[*].cell | La cellule sélectionnée dans chaque ligne |
$form.main.row.cell | La première ligne et la première cellule via un chemin absolu |
row[-1].cell | La ligne précédant l'occurrence inférée |
row[+1].cell | La ligne suivant l'occurrence inférée |
main..cell[*] | Les cellules sœurs correspondantes dans la première branche descendante |
main.* | Tous les enfants directs dans l'ordre du document |
main.#field[name='target'] | Les champs sélectionnés par un prédicat sur la propriété de nommage |
main.#subform[*].#field | Le champ sélectionné sous chaque subform, en faisant correspondre les noms de classes |
main.part\.name | Un chemin de résolveur JavaScript contenant un point échappé dans un nom de nœud |
Un index omis sélectionne une occurrence ; un chemin absolu utilise l'occurrence zéro, tandis qu'un chemin scopé emprunte l'index de l'ancêtre ou du conteneur correspondant quand les structures ont des sœurs répétées
L'inférence d'index suit les niveaux de hiérarchie correspondants même quand les nœuds source et destination portent des noms différents ; les sélecteurs de classe empruntent l'index d'occurrence de classe correspondant
Une cible à occurrence unique est sélectionnée sans exiger l'index d'occurrence de l'appelant ; une occurrence inférée manquante renvoie une liste vide ou null au lieu de sélectionner silencieusement un autre scope
Les index relatifs sont des décalages par rapport à l'occurrence inférée sans préfixe et sont invalides dans les chemins absolus ; les expressions d'index FormCalc peuvent calculer une occurrence au runtime
Les conteneurs sans nom sont transparents pour la recherche d'enfants nommés ; la qualification par le parent et les propriétés prises en charge comme rawValue, name, className, index, presence et access sont disponibles, et les exports lexicaux des script objects peuvent être résolus et affectés via des chemins FormCalc
Conditions
const rows = xfa.resolveNodes("main.row[*].(Number(this.cell.rawValue)>15)");
const selected = xfa.resolveNodes("main.row[*].[cell ge 20].cell");
target = Sum($.resolveNodes("row.[cell ge 20].cell"))
row[1].cell = 25
var p = Ref(row[1].cell)
p = 30
Les prédicats JavaScript utilisent .(expression) et s'exécutent avec le candidat comme this ; les prédicats FormCalc utilisent .[expression] et résolvent les champs relatifs par rapport à ce candidat
Un prédicat sélectionne les sœurs correspondantes même quand [*] est omis ; les prédicats JavaScript résolvent aussi les noms de champs nus dans le scope du candidat, et les chemins de prédicats dans le source FormCalc doivent être passés comme chaînes de résolveur entre guillemets
La recherche descendante parcourt dans l'ordre du document une branche qui satisfait les composants de chemin restants ; une branche sans suffixe correspondant ne masque pas une correspondance complète ultérieure
Un index d'occurrence est local à son groupe de sœurs correspondantes ; un index hors limites termine cette recherche descendante, donc main..cell[1] ne sélectionne pas une cellule dans une autre ligne quand la première ligne n'a qu'une seule cellule
Un joker précédent évalue la recherche descendante indépendamment pour chaque contexte sélectionné, et un joker directement après une racine absolue sélectionne les enfants de la racine
Les prédicats JavaScript reçoivent les objets xfa et event de l'événement courant ; la recherche relative au candidat, les exceptions de prédicats et les écritures natives partagent la transaction englobante
Un Eval imbriqué hérite du candidat du prédicat, utilise des variables et fonctions de calcul isolées, et partage les réponses de compilation natives et le replay transactionnel avec l'événement englobant
Exists(missing) et un accesseur vers une occurrence indexée inexistante renvoient 0 via Exists ; l'usage ordinaire d'un objet FormCalc non résolu lève une erreur
Budgets et migration
Les chemins admettent au plus 128 composants et 65 536 unités de code UTF-16 ; les index doivent être des entiers sûrs (safe integers), et le parcours, les prédicats, la compilation dynamique et les opérations d'instances partagent les budgets d'exécution des événements
Les erreurs du parser, les exceptions de prédicats et les budgets dépassés avortent l'événement et restaurent les valeurs de champs natives, l'ordre des instances et l'état des scripts via TXFAWidgetRuntime
L'ancien resolveNodes général développait les index omis à travers tous les ancêtres répétés ; utilisez main.row[*].cell[*] quand chaque ligne et chaque cellule sont visées, à la place de main.row.cell[*]
Couverture
Le résolveur opère sur les objets de formulaire dynamiques fournis par les event bindings, y compris les champs, subforms, draws, exclusion groups, areas et script objects, le Data DOM natif exposé via $data et $record, et les nœuds de propriétés de template déclarés avec leurs attributs effectifs
L'échappement de noms JavaScript est pris en charge par les chaînes de résolveur ; les identifiants du source FormCalc conservent la grammaire d'identifiants du compilateur
APIs associées
HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, Eval dynamique, Références FormCalc et Runtime XFA interactif