Ember.TextField へのユーザー入力で検証が失敗した場合など、アプリケーション レイヤー間のバインディングを中断できるように、pauseBinding()
andの書き方を理解しようとしています。resumeBinding()
var source = Ember.Object.create({ value: 10 });
var target = Ember.Object.extend({
source: source,
valueBinding: 'source.value'
});
console.log(source.get('value'), target.get('value')); // 10, 10
target.set('value', 20);
console.log(source.get('value'), target.get('value')); // 20, 20
// Stop synchronizing between target.value and source.value
pauseBinding(target.get('valueBinding'));
// Only update target.value
target.set('value', 40);
console.log(source.get('value'), target.get('value')); // 20, 40
// Resume synchronizing, target.value is overwritten
resumeBinding(target.get('valueBinding'));
console.log(source.get('value'), target.get('value')); // 20, 20
または、これをより一般的に尋ねると、条件付きバインディング、条件に応じて一方向のみ、他の一方向のみ、双方向、または無方向のバインディングを作成するための最も適切なイディオムは何ですか(別のプロパティ) ?
条件は、検証 (検証が失敗した場合、無効な値をさらに広げないでください) である場合や、フォーカスなどの UI 状態に応じた条件である場合があります (コントロールがフォーカスされている場合は、その値をプログラムで更新しないでください。これは UI を混乱させます)。
たとえば、valueBinding を持つ Ember.TextField が (アクティブなユーザー入力のように) フォーカスされている場合、バインディングの to() 側が更新されたとしても、更新されたくありません。しかし、これは反対方向の oneWay() バインディングのようです (oneWay to -> from ではなく、oneWay from -> to)。