我有一个Ember组件,因为......
export default Ember.Component.extend({
didInsertElement: function() {
this.$().sortable({
connectWith: '.droppable-box',
receive: (e, ui) => {
}
});
},
tagName: 'ul',
classNames: ['droppable-box', 'list-unstyled']
});
可排序组件内的元素也是组件......
export default Ember.Component.extend({
tagName: 'li'
});
只要将元素移动到可排序组件中,就会触发receive事件。
我获得了DOM元素,但我希望能够访问该Ember组件的实例。有什么想法吗?
答案 0 :(得分:4)
这不是最干净的解决方案,但它应该有效。
在您的子组件中添加以下生命周期钩子:
//components/child-component.js
...
registerRow: Ember.on('willInsertElement', function () {
this.attrs.onRegister(this.get('elementId'), this);
}),
unregisterRow: Ember.on('willDestroyElement', function () {
this.attrs.onUnregister(this.get('elementId'));
}),
在父模板中,将操作处理程序传递给所有子组件:
//components/parent-component.hbs
{{#each children as |child|}}
{{child-component onRegister=(action "registerChild") onUnregister=(action "unregisterChild")}}
{{/each}}
在父组件中,创建一个字典来存储由elementId索引的子组件:
//components/parent-component.js
...
children: null,
initChildren: Ember.on('init', function () {
this.set('children', {});
}),
actions: {
registerChild(elementId, child) {
this.children[elementId] = child;
},
unregisterChild(elementId) {
delete this.children[elementId];
}
}
现在,要从jQuery回调访问组件,请执行:
// Presuming ui is a DOM element
receive: (e, ui) => {
let component = this.children[ui.id];
}
答案 1 :(得分:0)
有一种更简洁的方法,但使用Ember私有API。
为Ember.Component的根元素分配了一个id。您可以使用此ID来查找组件。
// Ember 1.x
Ember.View.views[id]
// Ember 2.x
container.lookup('-view-registry:main')[id]
我确实有一个容器的实例附加到组件上。