我在sap.m表输入上有一个RecommendationionItems,在值状态更改后没有出现。
请注意,使用的SAPUI5版本为1.38.37
我有一个sap.m表,其中包含启用了建议列表的列。用户必须从可用的建议列表中选择客户编号。他也可以手动输入。
现在有根据用户输入的验证列表。
XML.view
<items>
<ColumnListItem>
<cells>
<Input id="idCustNumber" type="Text" value="{path:'createJSON>CUSTNO'}" change="onCustValChange" liveChange="onLiveChangeCustNo"
startSuggestion="3" maxSuggestionWidth="400px" showSuggestion="true" suggestionItemSelected="OnSuggestionSelectedCustNumber"
suggest="handleSuggestCustNo" suggestionItems="{path:'ITEMVALJSON>/items', templateShareable:false}">
<suggestionItems>
<core:Item key="{ITEMVALJSON>CustNoAndName}" text="{ITEMVALJSON>CustNoAndName}"/>
</suggestionItems>
</Input>
Controller.js
handleSuggestCustNo: function (oEvent) {
var sTerm = oEvent.getParameter("suggestValue");
oEvent.getSource().setFilterFunction(function (sTerm, oItem) {
// A case-insensitive 'string contains' style filter
return oItem.getText().match(new RegExp(sTerm, "i"));
});
},
onCustValChange: function (oEvent) {
var oInput = oEvent.getSource();
this._validateCustValInput(oInput);
},
_validateCustValInput: function (oInput) {
var oBinding = oInput.getBinding("suggestionItems");
var value = oInput.getValue();
if (value !== "") {
var filters = [new Filter("CustNo", sap.ui.model.FilterOperator.EQ, value)];
var found = oBinding.filter(filters).getLength();
if (found === 0) {
oInput.setValueState(sap.ui.core.ValueState.Error);
this.sSelectedTableRow.ERRORFLAG = "X";
oInput.setValueStateText("Customer " + "'" + value + "' is invalid for GCC: " + "'" + this.Header.Cntry + "'");
} else {
oInput.setValueState(sap.ui.core.ValueState.None);
this.sSelectedTableRow.ERRORFLAG = "";
}
} else {
oInput.setValueState(sap.ui.core.ValueState.None);
this.sSelectedTableRow.ERRORFLAG = "";
}
},
现在的问题是,如果验证失败,则将值状态设置为error。然后值更改后,建议列表不出现。
问题不是验证本身(或SAPUI5版本),而是在以下代码行中:
var found = oBinding.filter(filters).getLength();
[这里您正在过滤suggestionItems
聚合...。这就是为什么它们停止工作的原因:ITEMVALJSON模型仅填充有选定并经过验证的值。尝试取消输入中的绑定值字母,您将明白我的意思。
通过这种方式,我注意到了另外两件事:您正在过滤错误的属性(但可能只是剪切和粘贴的问题),并且handleSuggestCustNo
函数可能是不必要的。您只能在初始化阶段为输入设置一次过滤功能(setFilterFunction
)。
希望这会有所帮助。
根据建议,我已经清除了_validateCustValInput
末尾的过滤器。因此,现在我可以在更正任何无效客户条目的同时获得建议。
oBinding.filter([]);
但是出现了一个新问题。现在,当我从建议列表中进行选择并更正无效条目时,onCustValChange
没有得到调用。所以我的ValueState更改逻辑没有被调用。请参考下面的屏幕截图。Customer Validation