FormCalc の値とリファレンス
EnableJavaScript を有効にした通常の FormCalc 実行では、Ref(value) による明示的なオブジェクトリファレンスが実装されます。通常の変数宣言と通常の関数引数はオブジェクト値をコピーします
Ref のパラメータと結果
既存フォームオブジェクトへのアクセッサはオブジェクトハンドルになります。既存ハンドルを渡すとその識別子が保たれ、null 引数は null ハンドルを生み、その他のスカラー引数はそのスカラー値を返します
リファレンスは rawValue、parent、name、resolveNode、resolveNodes といった通常のノードプロパティとメソッドを提供します
スカラーを取る組み込み引数はハンドルを参照外しし、集計関数は参照された値を消費し、null ハンドルは null の算術・文字列セマンティクスを保ちます。Exists は null ハンドルに対して 0 を返します
var copied = target
target = 8
other = copied
var p = Ref(target)
p = 9
var q = p
q = 10
最初のブロックは target の以前の値を copied に保存します。2 番目のブロックは同じオブジェクトを指す 2 つのハンドルを通じて target に書き込みます
代入と切り離し
| 代入 | 動作 |
|---|---|
p = Ref(other) | p を別のオブジェクトに再束縛します |
p = 5 when p is a reference | 参照先オブジェクトに 5 を書き込み、ハンドルを保持します |
p = Null() when p is a reference | 参照先オブジェクトの値をクリアし、ハンドルを保持します |
p = Ref(Null()) | p を切り離し、変数に null 値を与えます |
p = 5 after detachment | 変数自体に 5 を設定します |
変数の再宣言とユーザー関数引数にも同じコピー・リファレンス規則が適用されます。関数は明示的なリファレンスを受け取り、返し、修飾できます
等価性と識別子
両オペランドがリファレンスのとき、等価・不等価の比較は安定したオブジェクト識別子を見ます。通常のオブジェクトオペランドは値を比較し、結果は数値の 1 か 0 です
同じテキストを含む 2 つのフィールドは値として等価と比較されますが、別のフィールドであれば Ref(first) eq Ref(second) は 0 を返します
繰り返しインスタンスと保持されたハンドル
スクリプトオブジェクトは明示的なハンドルをイベントをまたいで保持できます。ハンドルは安定した識別子で現在のフォームノードを解決するため、繰り返しサブフォームの並べ替えでも選択された出現が保たれます
出現削除後のハンドル使用はエラーになります。そのエラーがイベントを中断したとき、ランタイムトランザクションは出現数、フィールド値、スクリプトオブジェクト状態を復元します
ランタイムは安定したテンプレートとデータの識別子を自動的に供給します。TXFAEventBinding.Identity を省略した直接イベント呼び出し側は一意なバインディングインデックス識別子を受け取るため、バインド順が変わるときは明示的な安定識別子を指定してください
移行
以前の通常実行は変数宣言で通常のノードオブジェクトを保持していました。p をノードハンドルのままにする必要がある場合は var p=target を var p=Ref(target) に置き換えてください
通常の FormCalc の等価結果は、JavaScript のブールテキストの代わりに 1 と 0 を使うようになりました。等価結果を連結していたコードは数値表現を想定してください
関連 API
動的 Eval、HPDFXFACompileFormCalcEvent、TXFAEventBinding、インタラクティブ XFA ランタイム