如何覆盖EmberJS中的属性绑定?

时间:2015-01-12 16:29:44

标签: ember.js

我正在尝试扩展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

2 个答案:

答案 0 :(得分:2)

虽然不是最易于维护的路径,但您可以在视图中的init事件上手动删除和添加属性绑定。 Here is a working JS Bin

只需将属性绑定视为ember数组,并将addObjectremoveObject与完整绑定字符串一起使用(例如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')
});

再次,here is a working JS Bin

答案 1 :(得分:1)

attributeBindings是一个"连接属性"这意味着它是一个数组,它接收和组合继承链上每个类的值,包括mixins。根据对Ember代码的粗略阅读,似乎条目是"更低"链上的早于放在连接数组中。构造元素时,属性绑定按顺序执行,这意味着较早(较低的属性)属性会被后来的(较高的属性)覆盖。

根据您的观点,您可能会将此称为错误。

让我们说一个更高(更超级)的班级说att1: val1,而一个更低(更少的超级)的班级说att1: val2。然后val1将赢得"。

更改用于att1的属性值的替代方法只是在您的子类中重新定义val1,它将被正确拾取。