暂时中断/暂停Ember.Binding

时间:2013-03-05 13:40:23

标签: ember.js

我正在试图弄清楚如何编写pauseBinding()resumeBinding(),以便我可以中断应用程序层之间的绑定,例如如果验证因用户输入Ember.TextField而失败。

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状态(如焦点)(如果控件是重点,请不要以编程方式更新其价值,因为这会混淆用户界面。)

例如,当聚焦具有valueBinding的Ember.TextField时(如在活动用户输入中),即使绑定的to()端更新,我也不希望它被更新。但这似乎是一个oneWay()绑定,它是相反的方向(oneWay from - > to,而不是oneWay to - > from)。

1 个答案:

答案 0 :(得分:-1)

这是一个JSFiddle,包含了创建ConditionalBinding类的最佳镜头:

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
});

pausingProperty设置为true时,from和to之间的绑定将不会在任一方向上同步。恢复后,绑定将同步到最新获胜(您还可以使用.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
});