如何在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尚未实现的浏览器事件。
你可以使用EventBus来告知变化,谁想要听到变化。但是,如果其他控制器尚未加载,他们当然不会得到事件...也许你可以将它与承诺结合起来......
您还可以使用具有双向绑定的全局模型,并将其用于下拉列表。当下拉列表发生变化时,更改将反映在相应的模型中。同时,在您的子控制器中,您可以为用于下拉列表的相同全局模型+路径等创建sap.ui.model.Binding(...)。另外,你会为Binding的change事件附加一个处理程序......这应该也可以。但是,这与使用EventBus有同样的缺点,但也许对你来说不是问题......
从UI5 1.65开始,在创建ManagedObjects / Controls时可以分配多个事件处理程序:
(...)ManagedObjects现在接受一个事件的多个事件监听器的数组。要使用
[data, listener, this]
将此用例与已支持的数组区分开来,具有多个侦听器的数组必须为每个侦听器使用嵌套数组表示法[在JS中]。在XMLViews中,多个侦听器必须用分号分隔。 (source)
<Button press=".myControllerMethod; .mySubController.thatMethod" />
new Button({
press: [
[ listener1 ], // 1st listener
[ data, listener2, thisArg2 ] // 2nd listener
]
});
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>