ObservableObject: bindData()

引数で渡されたオブジェクトをバインディングターゲットとして登録します。

構文

observableObject.bindData(target) => boolean
observableObject.bindData(target, twoWay) => boolean

引数

  • target: Object

    バインドする対象のオブジェクトです。ターゲットは以下のメソッドを持ちます:

    • reflectValues(valueMap)

      バインディングターゲットの状態を valueMap で更新してください。また、バインディングソースにもこの更新を反映してください。

      • valueMap : Object

        更新するプロパティと値を持つオブジェクトです。

    • onDataBinding(source)

      bindData() に渡されたときに呼び出されるコールバック関数です。処理が正しく完了したらターゲットにバインディングソースをプロパティ source でセットしてください。セットしなければバインドは失敗します。

      • source: Object

        バインディングソースへの参照です。以下のメソッドを持っています。

        • curateValues() => Object

          ソースの同期対象のオブジェクトです。

          • 返値: Object
        • reflectValues(valueMap) => Object

          バインドが双方向であれば valueMap でソースを更新します。単方向であれば共通キーに対してソースが持つ値でターゲットを更新します。

          • valueMap: Object

            共通キーと値のオブジェクトです。

          • 返値: Object

            共通キーと更新された値のオブジェクトです。

      また、既に source を持っていた場合は、他のバインディングソースにバインド済みと判定されてこのバインドは失敗します。

    ProtoViewLogic は以上の条件を満たしています。

  • twoWay: boolean?

    双方向バインディングを行うかどうかです。true なら双方向バインディングを、false なら単方向バインディングを要求します。双方向バインディングされるかどうかは allowsTwoWaytrue かどうかに依存します。

返値: boolean

登録に成功したかどうかです。true ならバインディングターゲットの登録に成功したか、既に自身に登録済みであることを示し、false なら何らかの理由で登録に失敗したことを示します。

//  ターゲットのプロトタイプ定義
const target_proto = {
    reflectValues(valueMap) {
        // ターゲットと valueMap の共通キーを取得して値を更新します
        const updated_values = {};
        for (const k of Object.keys(this)) {
            if (!(k in valueMap) || typeof valueMap[k] !== typeof this[k]) {
                continue;
            }
            const v = valueMap[k];
            this[k] = v;
            updated_values[k] = v;
        }
        // 双方向であればソースが更新されます。単方向であれば更新が巻き戻されます。
        this.source.reflectValues(updated_values);
    },
    onDataBinding(source) {
        this.source = source;
        this.reflectValues(source.curateValues());
    }
};

const bindObj = new ObservableObject({ output: "" }, true);

const target1 = Object.assign(Object.create(target_proto), { output: "" });
bindObj.bindData(target1, true);

const target2 = Object.assign(Object.create(target_proto), { output: "" });
bindObj.bindData(target2, false);

bindObj.output = "fizz";
// source.output  => fizz
// target1.output => fizz
// target2.output => fizz

target1.reflectValues({ output: "bazz" });
// source.output  => bazz
// target1.output => bazz
// target2.output => bazz

target2.reflectValues({ output: "fizzbazz" });
// source.output  => bazz
// target1.output => bazz
// target2.output => bazz