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
なら単方向バインディングを要求します。双方向バインディングされるかどうかはallowsTwoWay
がtrue
かどうかに依存します。- 既定値は
source.allowsTwoWay
と同じ値になります。
- 既定値は
返値: 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