SAPUI5中的EventBus是什么用的?

时间:2016-05-12 13:01:58

标签: sapui5

有人可以解释我们将要使用EventBus methods的内容和时间吗?还有什么样的活动。

1 个答案:

答案 0 :(得分:6)

UI5中的EventBus是一个工具,我们可以在我们的应用中利用 publish-subscribe pattern

我们如何获得EventBus?

目前,有两个API会返回自己的EventBus实例:

  • 全球:sap.ui.getCore().getEventBus();
    • 独立应用
    • 代码共享平台(例如JSBin)中的最小演示
  • 基于组件的:this.getOwnerComponent().getEventBus(); // Given this === controller适用于Fiori应用。由于Fiori Launchpad(FLP)上的“apps”是组件,SAP recommends从组件而不是从核心获取EventBus。

      

    如果需要事件总线,请使用组件的事件总线。这样,您可以避免冲突事件名称,并确保在卸载组件时自动删除侦听器。 使用全局事件总线。

注释

  1. 每次用户导航回家时,FLP都会销毁该组件。
  2. 在致电getEventBus()之前,请务必事先要求使用模块sap/ui/core/EventBus

    sap.ui.define([ // or .require
      // ...,
      "sap/ui/core/EventBus"
    ], function(/*...*/) {/*...*/});
    

    否则,模块将通过同步XHR加载,应避免使用。

  3. 它的用途是什么?

    使用EventBus,我们可以自由发射(通过publish()),并通过subscribe())收听我们自己的自定义事件:

    • 无需使用或扩展任何Control / ManagedObject / EventProvider类,
    • 在不知道其他相关听众(如果有)的存在的情况下,
    • 无需访问触发事件的对象(发布者)。例如:无需致电thatManagedObj.attach*()

    出版商和订阅者彼此无知,这使得松耦合成为可能。

    类似于现实世界,EventBus就像一个广播电台。一旦它开始在各种渠道上广播各种各样的东西,那些感兴趣的人可以听取特定的频道,得到通知,并用给定的数据做一些富有成效的事情。 Here is an image说明了EventBus的基本行为。

    说实话,我没有遇到任何我喜欢EventBus而不是标准解决方案的情况。如果我们遵循最佳实践,我们现在几乎不需要在UI5中 [1] 。我很高兴听到一些反驳意见。

    示例代码

    订阅

    onInit: function() { // file 1
      const bus = this.getOwnerComponent().getEventBus();
      bus.subscribe("myChannelId", "myEventId", this.shouldDoSomething, this);
    },
    
    shouldDoSomething: function(channelId, eventId, parametersMap) {
      // get notified from anywhere. E.g. when `doSomething` from file 2 is called
    },
    

    发布

    doSomething: function(myData) { // file 2
      const bus = this.getOwnerComponent().getEventBus();
      bus.publish("myChannelId", "myEventId", { myData }); // broadcast the event
    },
    

    请参阅API reference: sap/ui/core/EventBus

    [1]:EventBus曾经在UI5的早期为navigation发挥重要作用。