Ember 组件 classNameBinding 未绑定
Ember Component classNameBinding not binding
我有一个组件,它是一个按钮,需要通过它的父组件 属性 更改它的类名 component/controller:
// components/my-button/component.js
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'button',
classNameBindings: ['classNames'],
// some other unrelated stuff following....
});
它的模板:
// components/my-button/template.hbs
{{text}}
// nothing important here exept the test-output of:
{{classNames}}
然后我将它像这样插入到另一个组件中:
// component/parent-component/template.hbs
{{my-button
classNames=variableClassNames
text='foo'
}}
// components/parent-component/component.js
import Ember from 'ember';
export default Ember.Component.extend({
isSortableDown: Ember.computed('track.sort', 'maxSort', function() {
return this.get('track.sort')<this.get('maxSort');
}),
variableClassNames: Ember.computed('isSortableDown',function() {
if(this.get('isSortableDown')) {
return 'btn btn-xs btn-default';
} else {
return 'btn btn-xs btn-default push-20-r';
}
}),
// other unrelated stuff...
});
现在我的问题是:
当 isSortableDown
发生变化时,父项中的 variableClassNames
和子项 (component/my-button) 中的 classNames
被更新(也是我的按钮模板中的测试输出)。
但是 classNameBindings 没有更新,而是 classNames 出现了多次(当查看实际输出时 DOM)。
嗯,这不是 100% 正确,它们确实被添加了,但从未被删除。
因此,如果 className push-20-r
一旦被添加,它将保留在那里(在 DOM 中),但永远不会被删除,即使 属性 classNames
不包含它不再。
最后我的问题是我做错了什么,
或者如果 classNameBindings 不应该 更新(但为什么名称 'bindings' 呢??),
或者如果这最终是一个错误?
我在
Ember2.0.1
jQuery1.11.3
我发现的唯一可能相关的问题是:
https://github.com/emberjs/ember.js/issues/11980
https://github.com/emberjs/ember.js/issues/11556
但他们没有答案......或者只是与派对有关
旁注:
是的,我希望组件本身是 button
,而不是 div,否则我将不得不更改所有 css...我知道我可以通过留下组件 div 并包装那个按钮并在那里调整它的类名。
classNames
是组件中的特殊 属性。您可以尝试将名称更改为其他名称,看看是否有帮助?
http://emberjs.com/api/classes/Ember.Component.html#property_classNames
您正在使用 ember 组件 classNames
的特殊 属性 作为导致问题的绑定变量,您可以采取以下方法
export default Ember.Component.extend({
tagName: 'button',
classNameBindings: ['isSortableDown::push-20-r'], // class added when isSortableDown is false
classNames: ['btn', 'btn-xs', 'btn-default'], // classes that don't change
isSortableDown: true
// some other unrelated stuff following....
});
在模板中
{{my-button
isSortableDown=isSortableDown
text='foo'
}}
在您的父组件中
export default Ember.Component.extend({
isSortableDown: Ember.computed('track.sort', 'maxSort', function() {
return this.get('track.sort')<this.get('maxSort');
}),
// other unrelated stuff...
});
我有一个组件,它是一个按钮,需要通过它的父组件 属性 更改它的类名 component/controller:
// components/my-button/component.js
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'button',
classNameBindings: ['classNames'],
// some other unrelated stuff following....
});
它的模板:
// components/my-button/template.hbs
{{text}}
// nothing important here exept the test-output of:
{{classNames}}
然后我将它像这样插入到另一个组件中:
// component/parent-component/template.hbs
{{my-button
classNames=variableClassNames
text='foo'
}}
// components/parent-component/component.js
import Ember from 'ember';
export default Ember.Component.extend({
isSortableDown: Ember.computed('track.sort', 'maxSort', function() {
return this.get('track.sort')<this.get('maxSort');
}),
variableClassNames: Ember.computed('isSortableDown',function() {
if(this.get('isSortableDown')) {
return 'btn btn-xs btn-default';
} else {
return 'btn btn-xs btn-default push-20-r';
}
}),
// other unrelated stuff...
});
现在我的问题是:
当 isSortableDown
发生变化时,父项中的 variableClassNames
和子项 (component/my-button) 中的 classNames
被更新(也是我的按钮模板中的测试输出)。
但是 classNameBindings 没有更新,而是 classNames 出现了多次(当查看实际输出时 DOM)。
嗯,这不是 100% 正确,它们确实被添加了,但从未被删除。
因此,如果 className push-20-r
一旦被添加,它将保留在那里(在 DOM 中),但永远不会被删除,即使 属性 classNames
不包含它不再。
最后我的问题是我做错了什么,
或者如果 classNameBindings 不应该 更新(但为什么名称 'bindings' 呢??),
或者如果这最终是一个错误?
我在
Ember2.0.1
jQuery1.11.3
我发现的唯一可能相关的问题是:
https://github.com/emberjs/ember.js/issues/11980
https://github.com/emberjs/ember.js/issues/11556
但他们没有答案......或者只是与派对有关
旁注:
是的,我希望组件本身是 button
,而不是 div,否则我将不得不更改所有 css...我知道我可以通过留下组件 div 并包装那个按钮并在那里调整它的类名。
classNames
是组件中的特殊 属性。您可以尝试将名称更改为其他名称,看看是否有帮助?
http://emberjs.com/api/classes/Ember.Component.html#property_classNames
您正在使用 ember 组件 classNames
的特殊 属性 作为导致问题的绑定变量,您可以采取以下方法
export default Ember.Component.extend({
tagName: 'button',
classNameBindings: ['isSortableDown::push-20-r'], // class added when isSortableDown is false
classNames: ['btn', 'btn-xs', 'btn-default'], // classes that don't change
isSortableDown: true
// some other unrelated stuff following....
});
在模板中
{{my-button
isSortableDown=isSortableDown
text='foo'
}}
在您的父组件中
export default Ember.Component.extend({
isSortableDown: Ember.computed('track.sort', 'maxSort', function() {
return this.get('track.sort')<this.get('maxSort');
}),
// other unrelated stuff...
});