我正在研究将大型UI组件分解为更小的部分,但有一点我不完全确定如何处理,而我似乎无法找到一般信息的东西是从子组件中委派事件。例如,如果您有待办事项列表并单击待办事项列表,则会更新侧边栏并提供有关待办事项的详细信息。现在我们所拥有的代码基本上是一个带有模板的文件,并且可以处理所有事件。当您单击附加到列表和边栏的包装的委托处理程序时,它会在DOM节点中搜索数据。有数千个可点击的行。模块化JS组件授权模式
我想要的东西而不是沿着这样的线(这仅仅是伪代码):
app.controllers.todos = library.controller.extend({
init: function() {
// Store all the todo items in an array
this.todoItems = [];
todoItemsReturnedFromServer.forEach(function (data) {
var todoItem = new app.todo.item(data);
todoItems.push(todoItem);
});
this.todoList = new app.todo.list({data: this.todoItems}); // start with initial data
this.sidebar = new app.sidebar();
},
render: function() {
$('#wrapper').append(this.todoList.render());
$('#sidebar').append(this.sidebar.render());
}
});
所以,你有一个todolist的组件,你可以添加/删除从和你可以把事件连接起来,它可以更新DOM,但是与数据分离(即你不能有任何DOM,它会工作)。现在,在我们的应用程序中,如果您点击todoItem,todoItem需要将其事件委托给todoList或更高版本。我不希望每个todoItem都有一个点击事件。
我唯一的想法是在父组件获取(如果支持)并从中创建事件的子组件上具有“委托”属性。它会有事件和处理程序的散列。如果事件处理程序已经连接,它会忽略它。
这种类型的东西是否还有其他示例或模式?
可以监视列表的点击,并抓住从的listItem(event.target)的ID或其他标识符。这样,你不需要绑定项目上的任何事件,只需注入由模板和数据制作的html。 – dandavis
@dandavis事情是,我想保留LisItem事件的一部分,因为它们的语义是theyre listItem事件。授权是一个实现细节。如果我在itemList中设置所有处理程序,那么即使将它作为另一个组件,也没有什么收获。如果我误解了你能给我一个例子吗? –
您可以将事件与listItems捆绑在一起。关键是使用所有项目的一种方法,从列表或DOM中注入/获取它们可能需要的任何依赖项。这可以是添加到每个元素上的非事件js属性,或者只是使用HTML标记来将项目标识到项目的方法。所以,它可能是像itemList.onclick = Items.doItemAction(e.target.itemID,this)的东西...在这种情况下,是的,你有列表上的AN事件,但行动是所有在其他地方定义的项目方法,可能在物品制造商旁边。 – dandavis