1

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)。

4

1 に答える 1

-1

ConditionalBindingこれは、クラスを作成する際の私のベストショットを含む JSFiddle です。

http://jsfiddle.net/SDe8u/2/

次のように使用できます。

var from = Ember.Object.create({
    value: 0
});

var to = Ember.Object.create({
    from: from,
    valueBinding: ConditionalBinding
        .from('from.value')
        .pauseIfTrue('pausingProperty'),
        // Default:
        // .onResumeSetBothTo('latest')
    pausingProperty: false
});

が true に設定されているpausingProperty間、from と to の間のバインディングはどちらの方向にも同期されません。再開時に、バインドは latest-wins に同期されます (または を使用して、またはからの同期を明示的に設定することもできます.onResumeSetBothTo('to')) .onResumeSetBothTo('from')

一方向にのみ一時停止する場合は、onlyPause('from')またはを追加できonlyPause('to')ます。

var to = Ember.Object.create({
    from: from,
    valueBinding: ConditionalBinding
        .from('from.value')
        .pauseIfTrue('pausingProperty')
        .onlyPause('from')
        .onResumeSetBothTo('from'),
    pausingProperty: false
});
于 2013-03-05T17:59:00.417 に答える