我正在尝试扩展Ember.TextField的一些行为。我正在尝试为type="datetime-local"
输入添加一些逻辑,以便能够直接绑定日期类型的变量。
众所周知,输入值是字符串,而不是日期。所以在我扩展Ember.TextField的新类中,我需要一个绑定到输入的新属性,它基本上是一个转换为输入所需字符串的日期。
理想情况下,我想重新打开Ember.TextField,然后仅在输入类型为datetime-local
并且绑定值为Date时才应用此逻辑。
我的问题是:
有没有办法更改超类中定义的属性绑定?如果有可能,我可以在我的View / Component子类中编写attributeBindings:['value:textValue']
。这将覆盖Ember.TextField中的先前值绑定定义。
X-reference:https://github.com/emberjs/ember.js/issues/10176
答案 0 :(得分:2)
虽然不是最易于维护的路径,但您可以在视图中的init
事件上手动删除和添加属性绑定。 Here is a working JS Bin
只需将属性绑定视为ember数组,并将addObject
和removeObject
与完整绑定字符串一起使用(例如value:testValue
作为方法的参数):
App.SomeView = Em.View.extend({
attributeBindings: ['value:testValue']
});
App.ModalView = App.SomeView.extend({
attributeBindings: ['role'],
testValue: 'hello', // Could be on either class
role: 'dialog',
removeBindings: function() {
// role stays bound, value doesn't
this.get('attributeBindings').removeObject('value:testValue');
}.on('init')
});
答案 1 :(得分:1)
attributeBindings
是一个"连接属性"这意味着它是一个数组,它接收和组合继承链上每个类的值,包括mixins。根据对Ember代码的粗略阅读,似乎条目是"更低"链上的早于放在连接数组中。构造元素时,属性绑定按顺序执行,这意味着较早(较低的属性)属性会被后来的(较高的属性)覆盖。
根据您的观点,您可能会将此称为错误。
让我们说一个更高(更超级)的班级说att1: val1
,而一个更低(更少的超级)的班级说att1: val2
。然后val1
将赢得"。
更改用于att1
的属性值的替代方法只是在您的子类中重新定义val1
,它将被正确拾取。