【问题标题】:Sending actions to a component with Ember.js 1.13使用 Ember.js 1.13 向组件发送操作
【发布时间】:2015-05-16 09:41:47
【问题描述】:

我有一个音频播放器 Ember.js 组件,我想从任何地方向它发送事件:

this.get('audioPlayer').send('play');

为了访问组件,我将组件设置为自身的属性,将其公开给控制器 (link)。

这在 Ember 1.13-beta 中停止工作,我认为我一定做错了。数据下降,行动上升等等。

您将如何构建具有全局音频播放器的应用程序?
您将如何发送对组件的操作? (或者有更好的方法吗?)

【问题讨论】:

  • 可能是一个错误。 Glimmer 引擎引入了一些回归。尝试搜索问题列表以查看是否已报告此问题。或者将此报告为错误。

标签: ember.js


【解决方案1】:

我设法让它在 1.13 中像这样工作:http://jsbin.com/serunaxozi/1/edit

唯一的变化是修改_register方法如下:

_register: function() {
    this.get('attrs.register-as.update')(this);
}.on('init')

1.13 正在更改组件引用属性的方式。组件上的属性通过attrs 对象访问,以将它们与组件变量区分开来。它们还具有 valueupdate 属性,用于通过 mut 关键字进行隐式单向绑定和双向绑定。

请记住,这仍在进行中,所以现在我们需要从属性中手动获取 update 方法并调用它,但我想将来这将使用 setter 完成,如下所示:

this.set('attrs.register-as', this);

还请记住,最终组件将与尖括号一起使用,并且您需要明确说明属性是 Ember 生成该更新方法的双向绑定:

<audio-player title="Michael Jackson" test={{test}} register-as={{mut audioPlayer}} />

目前这仍然有点问题(使用尖括号语法,attrs 在使用on('init') 运行的方法中不可用)。

-- 编辑--

属性在未来将不会在init 中可用,而是会有另一个钩子didInitAttrs。见https://github.com/emberjs/ember.js/issues/11200

【讨论】:

  • 这是否意味着我们必须空/未定义检查所有可选的数据操作? if (this.attrs.optionalAction) { this.attrs.optionalAction(this.get('data')); }
  • 如果它是可选的,您应该检查是否存在 (Ember.isPresent)。如果它不是可选的,就让它中断吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多