任何人都可以解释什么以及何时使用EventBus methods吗?同样是什么样的 Activity 。

最佳答案

UI5中的EventBus是一种工具,我们可以使用它在应用程序中利用publish-subscribe pattern

我们如何获得EventBus?

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

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


  • 笔记

    每次用户返回Home时,
  • FLP都会破坏该组件。
  • 在调用getEventBus()之前,请确保预先需要模块sap/ui/core/EventBus。例如。:

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

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

  • 这是为了什么

    使用EventBus,我们可以触发(通过publish()),并自由监听(通过subscribe())自己的自定义事件:
  • 无需使用或扩展任何Control / ManagedObject / EventProvider类,
  • 不知道其他相关侦听器(如果有)的存在
  • 无需访问引发事件的对象(发布者)。例如:无需调用thatManagedObj.attach*()


  • 发布者和订阅者彼此都不了解,这使得松散耦合成为可能。

    类似于现实世界,EventBus就像一个广播电台。一旦开始在各种频道上广播各种事物,有兴趣的人就可以收听特定的频道,得到通知,并使用给定的数据进行富有成效的工作。这是说明EventBus的基本行为的图像:

    sapui5 - SAPUI5中的EventBus有什么用途?-LMLPHP

    坦白地说,我没有遇到过任何需要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在navigation的UI5早期曾扮演着重要角色。

    关于sapui5 - SAPUI5中的EventBus有什么用途?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37187748/

    10-14 04:04