SAPUI5中路由器和事件总线的区别是什么

SAPUI5中路由器和事件总线的区别是什么,sapui5,Sapui5,有人能解释一下SAPUI5和之间的区别吗? 请帮助我在哪种情况下我们必须使用路由器或事件总线 让我试着用一个购物场景来解释你 假设您正在浏览“MyShopWeb”购物网站。让我们假设它是使用SAP UI5库开发的 主要功能: 在主页上无限滚动(比如,先加载n个项目,然后在你到达底部时再加载10个项目) 单击产品,您可以在单独的页面中查看其详细信息 根据您的选择在侧面板上显示建议 场景1:现在,在主页上您正在滚动。一旦您触底,新产品就会加载。注意: 在这里,我们需要在同一页上显示更多信息。我们没有

有人能解释一下SAPUI5和之间的区别吗?
请帮助我在哪种情况下我们必须使用路由器或事件总线

让我试着用一个购物场景来解释你

假设您正在浏览“MyShopWeb”购物网站。让我们假设它是使用SAP UI5库开发的

主要功能:

  • 在主页上无限滚动(比如,先加载n个项目,然后在你到达底部时再加载10个项目)
  • 单击产品,您可以在单独的页面中查看其详细信息
  • 根据您的选择在侧面板上显示建议
  • 场景1:现在,在主页上您正在滚动。一旦您触底,新产品就会加载。注意:

  • 在这里,我们需要在同一页上显示更多信息。我们没有导航或更改浏览器哈希

  • 路由器用于导航到与当前页面不同的页面并传递所需数据。因此,我不会在此处使用它。我希望位于同一页面上,并且不更改浏览器URL及其当前哈希

  • 那么,我如何在到达页面末尾后显示更多产品呢?检查浏览器页面末尾(通过JS)并加载更多。有很多方法

  • 所以,让我们假设有一个Messenger,X,他的工作是告诉全世界:嘿,他到了页面的末尾!!他到了页面的末尾。我们需要更多的产品

    还有一个听众,L,他一直在听我们的信使X。当他听到他的时候,他会给他发送新的数据

    所以,让我们把它转换成技术术语

    function initMethod() {
        var eventBus = sap.ui.getCore().getEventBus();
        eventBus.subscribe("homePage", "reachedEndOfPage", handleEndOfPage, this); // Listener L
    }
    
    function reachedEndOfPage() {
        var eventBus = sap.ui.getCore().getEventBus();
        eventBus.publish("homePage", "reachedEndOfPage"); // Messenger X
    
    }
    
    function handleEndOfPage() {
        // Ok.. lets send more data
    }
    
    场景2:单击产品。简单地说,将其移动到新页面。显示页面信息。更改Broswer URL和哈希,以便将其添加到书签中

    选择:路由器

    我们的SAPUI5路由器基于Crossroads JS。他们说Crossroads是:

    它是一个功能强大且灵活的路由系统。如果使用得当,它可以通过解耦对象以及抽象导航路径和服务器请求来降低代码复杂性

    用于导航的路由器

    但是事件总线可以在这里用于导航。如何使用?在产品的新闻事件中,发布事件(称为“产品已点击”),然后创建一个处理程序,该处理程序将订阅“产品已点击”事件,然后启动
    App.navTo
    Router.navTo

    所以,不同之处在于,事件总线为您可以手动触发的任何类型的事件创建侦听器

    其中as路由器用于导航,仅侦听浏览器哈希更改

    场景3:现在,我希望它变得清晰起来。我不是在导航,但我希望在用户每次单击产品时都能听到/做出反应

    因此,我将创建一个Messenger“Click”,当我点击任何产品时,他将大声呼喊(发布)。还有一个建议监听器,说是Listener“Suggest”,他将通过我们的Messenger收听/响应发布的事件:“Click”


    我希望它对您有所帮助。如果您仍然感到困惑,请告诉我。我们将根据需要尝试添加更多信息。

    使用路由器您可以在不同的目标之间导航。一个目标由一个或两个视图组成

    假设您在视图a中有一个列表,在视图B中有一个包含列表项详细信息的表单。按下视图a中的列表项时,您可以使用路由器导航到详细信息视图B

    通过事件总线可以在不同的活动控制器之间进行通信


    假设您有一个具有主视图和详细视图的拆分应用程序。您可以在主视图中触发事件,并在详细视图中侦听这些事件(反之亦然)

    我不明白这种混淆是从哪里来的。文档中缺少了什么?您试图理解其中的区别是什么?这个答案也可能有助于您更好地理解EventBus:。事实上,EventBus是执行导航的方式,但后来Router将其淘汰。您基本上可以与Eve进行任何通信ntBus。每个组件有一个EventBus+一个额外的全局事件总线,因此您甚至可以在组件/应用程序之间进行通信。所有这些都不需要知道事件发射器(imho比EventListener模式的最大优势)