如何覆盖 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.
中先前的值绑定定义
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 数组并使用 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')
});
我正在尝试扩展 Ember.TextField 的某些行为。我正在尝试为 type="datetime-local"
输入添加一些逻辑,以便能够直接绑定日期类型的变量。
众所周知,输入值是字符串,而不是日期。因此,在扩展 Ember.TextField 的新 class 中,我需要一个新的 属性 绑定到输入,该输入基本上是一个转换为输入期望的字符串的日期。
理想情况下,我想重新打开 Ember.TextField,然后仅在输入类型为 datetime-local
且绑定值为日期时才应用此逻辑。
我的问题是:
有什么方法可以更改 superclass 中定义的属性绑定?如果可能的话,我可以在我的 View/Component subclass 中写 attributeBindings:['value:textValue']
。这将覆盖 Ember.TextField.
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 数组并使用 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')
});