简体   繁体   English

如何以适当的方式嵌套组件

[英]How to nest components in a proper way

I'm starting with EMBER.js, and there are some doubts that I have: 我从EMBER.js开始,我对此有些怀疑:

Let's say that I am creating a simple chat, just for the example. 举例来说,假设我正在创建一个简单的聊天室。 I have a left-side panel with a list of users, and a right-side panel with the messages sent. 我有一个带有用户列表的左侧面板,和一个带有已发送消息的右侧面板。

I considered creating a component called: users-list , that displays a list of users. 我考虑过创建一个名为: users-list组件 ,该组件显示用户列表。 Every member of that list should be another component called user . 该列表的每个成员都应该是另一个名为user 组件

This means that a user component is responsible of drawing itself, with the user name, last sent message, name color, etc... (all are properties) and also has some actions in buttons beside its name: changeName, changeColor, leaveRoom. 这意味着user 组件负责绘制自身,包括用户名,上次发送的消息,名称颜色等(均为属性),并且在其名称旁边的按钮中还有一些操作:changeName,changeColor,leaveRoom。

While a users-list is responsible for maintaining a list of users and displaying them using the user component. users-list负责维护用户列表并使用user组件显示它们。

So the questions here are: 所以这里的问题是:

  1. Is this the proper way to go? 这是正确的方法吗?
  2. If it is: How can I delete an item from the users-list component, from an action inside of the child user component ( leaveRoom action)? 如果是这样的话:如何从子user组件内部的userleaveRoom操作)从users-list组件中删除项目?
  3. If not: How should I implement that? 如果没有:我应该如何实施? I'd like to keep responsibilities isolated. 我想把责任隔离开来。
  1. Is this the proper way to go? 这是正确的方法吗?

Yes, it is. 是的。 But you have to use hyphen in component name, so user component should become something like this: user-component . 但是您必须在组件名称中使用连字符,因此user组件应变为以下形式: user-component

If it is: How can I delete an item from the users-list component, from an action inside of the child user component (leaveRoom action)? 如果是:如何从子用户组件内部的操作(leaveRoom操作)中的用户列表组件中删除项目?

See WORKING DEMO . 请参阅工作演示

In users-list template pass an action (defined in users-list ) to user-component : users-list模板中,将操作(在users-list定义)传递给user-component

{{#each model as |user|}}
    {{user-component model=user leaveRoom=(action 'leaveRoom')}}
{{/each}}

Action leaveRoom in users-list : users-list操作leaveRoom

actions: {
  leaveRoom(user) {
    alert('User-list: user ' + user.name + ' wants to leave room.');
  }
}

Then, we have simple user-component template with button that fires an action leaveRoom of user-component : 然后,我们有一个简单的带有按钮的user-component模板,该模板会触发一个user-component的动作leaveRoom

{{model.name}} - <button {{action 'leaveRoom' model}}>Leave room</button>

Action leaveRoom in user-component calls action passed to component from users-list . user-component动作leaveRoom调用从users-list传递给组件的动作。 So, leaveRoom in user-component looks like this: 因此, user-component leaveRoom如下所示:

actions: {
  leaveRoom(user) {
    this.get('leaveRoom')(user);
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM