【问题标题】:Access the instance of the component from parent component in EmberJS在 EmberJS 中从父组件访问组件的实例
【发布时间】:2016-12-11 18:05:26
【问题描述】:

我有一个“容器”组件

# components/container-component.js

import Ember from 'ember';
export default Ember.Component.extend({
  displayComponent: 'simple-box'
});

模板是

# templates/container-component.hbs

<div>
  {{component displayComponent}}
</div>

现在,从“容器组件”实例中。如何访问计算出的“displayComponent”实例?

有什么想法可以解决吗?

当我使用 get 方法时,我得到了组件的字符串标识

this.get('displayComponent') 
# returns (String) 'simple-box'

【问题讨论】:

标签: ember.js ember-components


【解决方案1】:

据我所知,没有内置的方法可以从父组件的 js 文件中检索子组件。如果你真的想实现这个,请参考我为你准备的twiddle

从代码中可以看出;在模板中,父级将自己传递给子级,子级将自己注册给父级。请注意,这是代码异味的说明,这是我在项目中从未使用过的东西。

因为,在我看来,您想要达到的目标明显违反了 ember 所基于的许多原则。为什么要直接从父级获取子属性?您可以将操作注册到子组件并获得子组件内各种事件的通知。为什么需要直接访问?一个组件最好自己独立工作。在这种方法中,您正在使用子组件的内部设计考虑污染父代码。您可以通过父项中的 jquery 查询 DOM 树,但获取由 Ember 基础架构为您创建的子组件实例表明您正在尝试设计一些超出 Ember 方法的东西。如果您发布另一个问题(或修改此问题)来描述您的意图,我们可以为您提供更好的帮助。可能有人可以引导您进行更好的设计。最好的问候。

【讨论】:

  • 精彩的解释。谢谢!是的,我以与您展示的方式相同的方式实现它。是的,我似乎违反了原则。这意味着,我应该尝试以不同的方式完成它。所以我想要组件间通信的原因。是因为我需要在父组件中更新特定的 dom 元素。反之亦然。您能否解释一下您所说的“……收到各种事件的通知”。另外,我认为有一个可以由两个组件共享的“服务”。这有意义吗?
  • 我想说的是;子组件应仅在需要时通过操作通知父组件。这将在孩子和父母之间提供明确的关注点分离(客户端应该放在另一个父母中,并且父母应该包含其他孩子)。您可以参考official ember guide 通知家长孩子的变化。希望我会准备两个新的玩意儿来说明晚上孩子与父母之间的正确沟通方式。
  • 关于共享服务;看看一些带有小玩意儿的代码可能会更好。在相同的情况下应该有意义,但在其他情况下则不然。我会去从孩子发送动作并最初在父母中处理这些动作。
  • 非常感谢!你帮了很多忙。是的,我可以将一个简单的“动作”从父级传递给 chlid 组件。这实际上应该可以解决我的问题。
  • 太好了。最初,ember 有一些学习曲线可能会让您感到困惑,特别是如果您有其他框架或纯 JavaScript 的经验。越过那条曲线后,余烬变得有趣起来。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多