我正在试图弄清楚如何编写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)。
答案 0 :(得分:-1)
这是一个JSFiddle,包含了创建ConditionalBinding
类的最佳镜头:
你可以像这样使用它:
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
});