如何在没有 oEvent 的情况下处理函数调用
How to handle calling a function without oEvent
我有一个带有附加到 select
事件的处理程序的 CheckBox。在这个函数中是动态填充/显示几个字段的代码。如果我出现在屏幕上并且数据带来了一个值,该值已经使复选框 selected,那么这些字段不会显示(因为它们只有在我 select 复选框时才可见)。
我想确保如果 CheckBox 是自动 selected,我仍然应该能够处理函数中的逻辑,该函数将 oEvent
作为输入参数。但问题是,如果我从另一个方法调用这个函数,那个函数就不起作用,因为它有很多语句,比如 oEvent().getSource()
我没有传递。
Controller.js
onCheckBoxSelect: function(oEvent) {
var cells = sap.ui.getCore().byId("cell");
controlCell.destroyContent();
vc.abc();
var material= sap.ui.getCore().byId("abc");
var isSelected = oEvent.getParameters("selected").selected;
if (isSelected) {
// ...
}
},
someFunction : function(){
if(true){
// want to call onCheckBoxSelect here
}
// ...
},
我建议采用不同的方法。使用您在复选框绑定中使用的相同 属性 来确定其他字段的可见性,即将每个相关字段的 visible
属性 绑定到那个 属性在你的模型中。
如果在填充字段时需要额外的 post 处理,您可以使用 expression binding or custom formatter for field-specific processing, or model binding events 如果您需要做更多的 "staging" 工作(在这种情况下,您可能会将结果数据存储在客户端模型中并绑定到该模型以填充您的字段)。
如果您为您的复选框分配一个 ID,您可以在任何您想要的函数中获取该复选框,只要它在视图中是已知的。通过这样做,您将不需要仅在执行复选框上的事件时才可用的 oEvent。
示例:
var cb = this.byId('checkboxId');
if(cb.getProperty('selected')) {
// execute code
} else {
// do something else
}
将处理程序主体分离到一个单独的函数中,以便其他函数可以使用正确的参数调用分离后的函数。例如:
控制器
onCheckBoxSelect: function(oEvent) {
const bSelected = oEvent.getParameter("selected");
this.doIt(bSelected); // Instead of "doing it" all here
},
someFunction: function(){
if (/*Something truthy*/) {
const checkBox = this.byId("myCheckBox");
const bSelected = checkBox.getSelected();
doIt(bSelected); // passing the same argument as in onCheckBoxSelect
}
// ...
},
doIt: function(bSelected) { // decoupled from onCheckBoxSelect
// ...
if (bSelected) {
// ...
}
},
查看
<CheckBox id="myCheckBox"
select=".onCheckBoxSelect"
/>
或自 1.56 以来:
<CheckBox id="myCheckBox"
select=".doIt(${$parameters>/selected})"
/>
文档:Handling Events in XML Views
这样,您就可以拥有一个可以从任何地方调用的纯解耦函数。
我有一个带有附加到 select
事件的处理程序的 CheckBox。在这个函数中是动态填充/显示几个字段的代码。如果我出现在屏幕上并且数据带来了一个值,该值已经使复选框 selected,那么这些字段不会显示(因为它们只有在我 select 复选框时才可见)。
我想确保如果 CheckBox 是自动 selected,我仍然应该能够处理函数中的逻辑,该函数将 oEvent
作为输入参数。但问题是,如果我从另一个方法调用这个函数,那个函数就不起作用,因为它有很多语句,比如 oEvent().getSource()
我没有传递。
Controller.js
onCheckBoxSelect: function(oEvent) {
var cells = sap.ui.getCore().byId("cell");
controlCell.destroyContent();
vc.abc();
var material= sap.ui.getCore().byId("abc");
var isSelected = oEvent.getParameters("selected").selected;
if (isSelected) {
// ...
}
},
someFunction : function(){
if(true){
// want to call onCheckBoxSelect here
}
// ...
},
我建议采用不同的方法。使用您在复选框绑定中使用的相同 属性 来确定其他字段的可见性,即将每个相关字段的 visible
属性 绑定到那个 属性在你的模型中。
如果在填充字段时需要额外的 post 处理,您可以使用 expression binding or custom formatter for field-specific processing, or model binding events 如果您需要做更多的 "staging" 工作(在这种情况下,您可能会将结果数据存储在客户端模型中并绑定到该模型以填充您的字段)。
如果您为您的复选框分配一个 ID,您可以在任何您想要的函数中获取该复选框,只要它在视图中是已知的。通过这样做,您将不需要仅在执行复选框上的事件时才可用的 oEvent。
示例:
var cb = this.byId('checkboxId');
if(cb.getProperty('selected')) {
// execute code
} else {
// do something else
}
将处理程序主体分离到一个单独的函数中,以便其他函数可以使用正确的参数调用分离后的函数。例如:
控制器
onCheckBoxSelect: function(oEvent) {
const bSelected = oEvent.getParameter("selected");
this.doIt(bSelected); // Instead of "doing it" all here
},
someFunction: function(){
if (/*Something truthy*/) {
const checkBox = this.byId("myCheckBox");
const bSelected = checkBox.getSelected();
doIt(bSelected); // passing the same argument as in onCheckBoxSelect
}
// ...
},
doIt: function(bSelected) { // decoupled from onCheckBoxSelect
// ...
if (bSelected) {
// ...
}
},
查看
<CheckBox id="myCheckBox"
select=".onCheckBoxSelect"
/>
或自 1.56 以来:
<CheckBox id="myCheckBox"
select=".doIt(${$parameters>/selected})"
/>
文档:Handling Events in XML Views
这样,您就可以拥有一个可以从任何地方调用的纯解耦函数。