フォームオブジェクトのデータソースには,Form.object.property
のようなオブジェクト記法を設定することができます。スカラー型の変数やフィールドであれば,値を更新した直後のイベントサイクルでフォームオブジェクトが再描画されます。しかし,オブジェクトは参照型なので,プロパティの値を更新しても,オブジェクト自体が更新されるわけではありません。
過剰な再描画を避けつつ,値の更新を逃さないようにするため,4Dは内部的に更新スタンプを管理しています。それぞれのプロパティには更新スタンプが存在し,値が更新されると,スタンプがインクリメントされるようになっています。加えて,オブジェクト自体にも更新スタンプが存在し,いずれかのプロパティが更新されると,インクリメントされるようになっています。
4Dは,フォームを再描画するタイミングになると,まず,データソースの更新スタンプが変化しているかどうかをチェックします。プロパティのスタンプが変化していない場合,今度はオブジェクト自体のスタンプをチェックします。スタンプが変わっていないフォームオブジェクトは再描画されません。
問題は,オブジェクト型の計算属性です。計算属性は,実際のプロパティではないため,Function set
で値を更新しても,スタンプがインクリメントされることはありません。他に更新したプロパティがなければ,オブジェクト自体のスタンプもインクリメントされません。そのため,属性に値を代入してもフォームが再描画されない,という現象が起きます。
フォームオブジェクトのデータソースに計算属性を使用している場合,このことに留意する必要があります。シンプルな対策として計算属性のFunction set
で内部的な実際のプロパティ(たとえばThis._stamp
)をインクリメントすることができます。計算属性にはスタンプがありませんが,同時に別のプロパティを更新するように計算属性を仕込んでおけば,オブジェクト自体のスタンプがインクリメントされ,実際のプロパティと同じように再描画されるようになります。