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

How to override attribute bindings in EmberJS?

我正在尝试扩展 Ember.TextField 的某些行为。我正在尝试为 type="datetime-local" 输入添加一些逻辑,以便能够直接绑定日期类型的变量。

众所周知,输入值是字符串,而不是日期。因此,在扩展 Ember.TextField 的新 class 中,我需要一个新的 属性 绑定到输入,该输入基本上是一个转换为输入期望的字符串的日期。 理想情况下,我想重新打开 Ember.TextField,然后仅在输入类型为 datetime-local 且绑定值为日期时才应用此逻辑。

我的问题是:

有什么方法可以更改 superclass 中定义的属性绑定?如果可能的话,我可以在我的 View/Component subclass 中写 attributeBindings:['value:textValue']。这将覆盖 Ember.TextField.

中先前的值绑定定义

X-参考:https://github.com/emberjs/ember.js/issues/10176

attributeBindings 是一个 "concatenated property",这意味着它是一个数组,它从继承链上的每个 class 中获取并组合值,包括混合。根据对 Ember 代码的粗略阅读,链上 "lower" 的条目似乎被放置在 较早 的串联数组中。构造元素时,属性绑定按顺序执行,这意味着较早的(较低的,您的)属性将被较晚的(较高的,他们的)属性覆盖。

根据您的观点,您可能会称这是一个错误。

假设更高(更多超级)class 表示 att1: val1,而较低(较少超级)class 表示 att1: val2。然后 val1 将 "win".

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

虽然这不是最易于维护的路径,但您可以在视图中的 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