UI5中的事件注册 - 将多个侦听器附加到事件

问题描述 投票:2回答:2

如何在UI5中为事件添加多个事件侦听器?

我们有一个主列表,其下拉列表正在其控制器上正确触发select事件。还需要通知子控制器该下拉列表已更改,以便重新加载模型数据。

onAllRolesChange: function(oEvent) {
  var key = oEvent.getParameter("selectedItem").getProperty("text");
  if (this.ScreenId != null) {
    this.loadScreenByRole(key);
    // I could invoke the controllers directly, but that seems wrong
    // controller2.update();
    // controller3.update();
  }
},

我假设我应该的目标是在每个控制器中调用某种registerForEvent()方法,但我在SDK中看不到类似的东西。 fireEvent()attachEvent()存在,但我见过的例子似乎是用于创建自定义控件,或响应SAP尚未实现的浏览器事件。

model-view-controller event-handling sapui5
2个回答
1
投票

你可以使用EventBus来告知变化,谁想要听到变化。但是,如果其他控制器尚未加载,他们当然不会得到事件...也许你可以将它与承诺结合起来......

您还可以使用具有双向绑定的全局模型,并将其用于下拉列表。当下拉列表发生变化时,更改将反映在相应的模型中。同时,在您的子控制器中,您可以为用于下拉列表的相同全局模型+路径等创建sap.ui.model.Binding(...)。另外,你会为Binding的change事件附加一个处理程序......这应该也可以。但是,这与使用EventBus有同样的缺点,但也许对你来说不是问题......


1
投票

从UI5 1.65开始,在创建ManagedObjects / Controls时可以分配多个事件处理程序:

(...)ManagedObjects现在接受一个事件的多个事件监听器的数组。要使用[data, listener, this]将此用例与已支持的数组区分开来,具有多个侦听器的数组必须为每个侦听器使用嵌套数组表示法[在JS中]。在XMLViews中,多个侦听器必须用分号分隔。 (source)

Syntax

在XMLView中

<Button press=".myControllerMethod; .mySubController.thatMethod" />

在JS中

new Button({
  press: [
    [ listener1 ], // 1st listener
    [ data, listener2, thisArg2 ] // 2nd listener
  ]
});

Demo

sap.ui.getCore().attachInit(() => sap.ui.require([
  "sap/ui/core/mvc/XMLView"
], XMLView => XMLView.create({
  definition: `<mvc:View xmlns:mvc="sap.ui.core.mvc"
    xmlns="sap.m"
    height="100%"
    displayBlock="true"
  >
    <Button text="Press" class="sapUiTinyMargin"
      press="alert('1st event handler'); alert('2nd event handler')"
    />
  </mvc:View>`,
}).then(view => view.placeAt("content"))));
<script id="sap-ui-bootstrap"
  src="https://openui5nightly.hana.ondemand.com/resources/sap-ui-core.js"
  data-sap-ui-libs="sap.ui.core, sap.m"
  data-sap-ui-async="true"
  data-sap-ui-compatVersion="edge"
  data-sap-ui-theme="sap_fiori_3"
></script>
<body id="content" class="sapUiBody"></body>
© www.soinside.com 2019 - 2024. All rights reserved.