【问题标题】:How do independent components communicate in ember?ember中独立组件如何通信?
【发布时间】:2015-01-24 06:55:38
【问题描述】:

如何让独立组件知道组件中的更改或事件?

例如:

 <#user-social profile>
  {{partial 'user-handle'}}

  <div class='subtext'> 
    {{#reply-component}} {{/reply-component}}
  </div>

  <div class='replybox hide'>
    <textarea></textarea>
    <input type='button' value='Reply to user' />
  </div>
 </user-social profile>

问题:我希望replybox 在点击回复组件中的链接时切换其可见性。

【问题讨论】:

  • 在回复组件中,您可以使用“parentView”属性访问用户社交。因此,当点击链接时,在父组件中设置一个值,如 this.set('parentView.isToggle', false);你可以让回复框绑定到那个值。

标签: ember.js handlebars.js ember-components


【解决方案1】:

组件在设计上是隔离的。您有责任指定它们的依赖关系。您可以通过将绑定属性传递给子组件或指定子组件在父组件上触发的操作来在父组件和子组件之间引入通信通道。

动作可能更合适,因为使用双向绑定作为一种通信形式越来越多地被认为是一种反模式。一个例子:

{{#reply-component toggleReplybox="toggleReplybox"}}

然后,在您的子组件中:

actions: {
  whateverTriggersTheToggle: function() {
    this.sendAction('toggleReplybox');
  }
}

您必须将 whateverTriggersTheToggle 操作添加到子组件内的某些内容中。

在父组件中: 显示回复框:假,

actions: {
  toggleReplybox: function() {
    this.set('displayReplybox', !this.get('displayReplybox'));
  }
}

这需要在 replybox 元素周围添加一个 {{#if displayReplybox}} 包装器。

【讨论】:

  • “使用双向绑定作为一种通信形式越来越多地被认为是一种反模式” - 我认为相反......你有任何来自 ember 核心团队的帖子/文章/推文/任何东西关于这个?
  • The Road to Ember 2.0 RFC 在“默认情况下的单向绑定”标题下提到了它(希望我可以直接链接到它)。 Tom Dale 和 Yehuda Katz 也在他们的appearance on The Changelog 上详细介绍了它。
  • 哇,谢谢,太好了。尽管我以前读过那篇文章,但我还是错过了。
  • 也许是因为它是小说长度!哈哈。这些概念需要一段时间才能渗透到发布版本中,因此我们有时间适应。
  • @BuckDoyle 操作不会返回到父组件,而是返回到控制器,然后是路由层次结构。他们跳过父组件。我看不出this.sendAction('toggleReplybox') 将如何导致父组件中的toggleReplybox 动作被调用。
猜你喜欢
  • 2014-07-14
  • 2020-01-02
  • 2016-05-29
  • 1970-01-01
  • 2016-09-05
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
相关资源
最近更新 更多