ObservableValue: bindData()
引数で渡されたオブジェクトをバインディングターゲットとして登録します。
構文
observableValue.bindData(target) => boolean
observableValue.bindData(target, twoWay) => boolean
引数
-
target:Objectバインドする対象のオブジェクトです。ターゲットは以下のメソッドを持ちます:
-
setValue(newValue)バインディングターゲットの値を
newValueで更新してください。 また、バインディングソースにもこの更新を反映してください。-
newValue:any更新する値です。
-
-
onDataBinding(source)bindData()に渡された時に呼び出されるコールバック関数です。 処理が正しく完了したらターゲットにバインディングソースをプロパティsourceにセットしてください。 セットしなければバインドは失敗します。-
source:Objectバインドソースへの参照です。以下のメソッドを持っています。
-
setValue(newValue) => booleanバインドが双方向であれば
newValueでソースを更新します。 単方向であればソースの値でターゲットを更新します。返値は値の更新に成功したかどうかを示します。成功した場合は
trueを、失敗した場合はfalseを返します。
-
また、すでに
sourceを持っていた場合、他のバインディングソースにバインド済みと判定されてこのバインドは失敗します。 -
infoAlierTextFieldなどのカスタムエレメントは以上の条件を満たしています。 -
-
twoWay:boolean(省略可)双方向バインディングを行うかどうかです。
trueなら双方向バインディングを、falseなら単方向バインディングを要求します。双方向バインディングされるかどうかは双方向バインディングが許可されているかどうか、つまり
allowsTwoWayがtrueかどうかに依存します。 もし双方向バインディングが許可されていない状態で双方向バインディングを要求した場合、バインドは成功しますが、単方向モードでバインドされます。既定値は
allowsTwoWayと同じ値になります。
返値: boolean
登録に成功したかどうかです。true ならバインディングターゲットの登録に成功したか、既に自身に登録済みであることを示し、false なら何らかの理由で登録に失敗したことを示します。
例
バインドターゲットが既にバインド済みである場合、そのバインドは失敗します。
// バインド可能なオブジェクトを生成
const target = create_target("Alice");
// 未バインドなのでバインドに成功する
const ov1 = new ObservableValue("Carol");
ov1.bindData(target);
// => true
// バインド済みなのでバインドに失敗する
const ov2 = new ObservableValue("Dave");
ov2.bindData(target);
// => false
双方向が許可されていない場合、第二引数の値に関わらず単方向でバインドされます。
// バインド可能なオブジェクトを生成
const target = create_target("Alice");
const ov = new ObservableValue("Carol", false);
// 双方向バインドを要求するが、 allowsTwoWay=false であるため単方向バインドになる
// ソースの値 "Carol" がターゲットに反映される
ov.bindData(target, true);
// 単方向バインドなので値は逆戻りする
target.setValue("Eve");
// => false
console.log(target.getValue());
// => "Carol"
双方向が許可されている場合、第二引数の値によってバインドの方向が決定されます。
// バインド可能なオブジェクトを生成
const target_oneway = create_target("Alice");
const target_twoway = create_target("Bob");
const ov = new ObservableValue("Carol", true);
// 単方向バインド
ov.bindData(target_oneway, false);
// 双方向バインド
ov.bindData(target_twoway, true);
// 単方向バインドなので値は逆戻りする
target_oneway.setValue("Eve");
// => false
console.log(ov.getValue());
// => "Carol"
// 双方向バインドなので値が更新される
target_twoway.setValue("Ellen");
// => true
console.log(ov.getValue());
// => "Ellen"
バインド可能なオブジェクトのファクトリ関数
以下のサンプルコードは上記の例で出現していたバインド可能なオブジェクトを生成するファクトリ関数の例です。
function create_target(value) {
let private_value = value;
return {
setValue(newValue) {
private_value = newValue;
return this.source?.setValue(private_value);
},
onDataBinding(source) {
this.source = source;
return true;
},
getValue() {
return private_value;
},
};
}