组件之间的灰烬通信

sha*_*ane 3 handlebars.js ember.js

我正在开发一个webapp来显示和搜索文档.我已经像这样布置了主要的包装器div:

<div class="wrapper">
    {{searchComponent searchComponent=searchComponent}}
    {{pdfViewer pdfSearchComponent=searchComponent}}
</div>
Run Code Online (Sandbox Code Playgroud)

这允许我稍后在其中添加其他类型的查看器,如下所示:

{{otherViewer otherSearchComponent=searchComponent}}
Run Code Online (Sandbox Code Playgroud)

外包装也是一个余烬组件.所以它的控制器看起来像:

Ember.controller.extend({
   searchComponent: null,
   .
   .
   otherProperties,
   actions: { }
});
Run Code Online (Sandbox Code Playgroud)

搜索组件将自己与itialization结合起来,受到这个来源的启发:http://www.samselikoff.com/blog/getting-ember-components-to-respond-to-actions/

Ember.controller.extend({
    searchComponent: null,
    .
    .
    onStart: function(){
       this.searchComponent = this;
    }.on('init'),
    .
    .
    actions: {
        someAction: function() {
            //do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我现在可以像这样从主pdfViewer引用组件:

this.get('searchComponent').send('someAction')
Run Code Online (Sandbox Code Playgroud)

为了获得响应,我现在将另一个属性绑定到所有控制器/模板,然后在查看器控制器中监视该属性的更改,之后我可以将结果放在需要的位置.

有没有办法从我的'pdfViewer'向我的'searchComponent'发送'消息'并接收'响应'而没有明确地将它们绑定在一起,如上所述?

fra*_*k06 7

你可以考虑使用的pub/sub通过Service事件总线,在你searchComponentpdfViewer两个发射和监听消息,这样可以互相交谈.当然,对服务存在依赖性,但从我看来,无论如何,您的组件都是非常特定于应用程序的.

就像是:

_listen: function() {
  this.get('eventBus').on('message', this, 'handleMessage');
}.on('init'),

actions: {
  click() { this.get('eventBus').trigger('message', message); }
}
Run Code Online (Sandbox Code Playgroud)

几个星期前,我评估了几种父子组件通信的方法:http://emberigniter.com/parent-to-children-component-communication/,也许这有点帮助.