如何显示扩展元素的错误消息?

How can I show error message for expanded elements?

我有一个 SAPUI5 应用程序并使用以下机制显示错误以防验证失败 (documentation):

oMessage = new sap.ui.core.message.Message({
                message: (typeof sText === "string" && sText.trim().length > 0) ? sText : ex.message,
                type: MessageType.Error,
                target: (oControlBinding.getContext() ? oControlBinding.getContext().getPath() + "/" : "") + oControlBinding.getPath(),
                processor: oControlBinding.getModel()
           });
this._aMessages[oControl.getId()] = oMessage;
sap.ui.getCore().getMessageManager().addMessages(oMessage);

此解决方案适用于正常输入:

普通元素是什么意思???

实际上,当它是一个显示扩展值的输入元素时,它不起作用,而当它未扩展时,它起作用。

例如当元素是:

<Input value="{ path: 'BusinessAddress/PostOfficeBox', type : 'sap.ui.model.type.String' , constraints:{search: '^[0-9]*$'}}">

其中显示扩展值没有得到错误信息框。

但对于具有类似 value="{ path: 'MobilePhone', type: 'sap.ui.model.type.String', constraints: {search: '^[0-9]+$'}}" 路径的元素,它会显示错误消息。

代码段生成的两个oMessage对象的区别是:

target: "/ContactSet('CO1')/BusinessAddress/PostOfficeBox"   ==> for expanded ones

BusinessAddress是实体ContactSet的外键,已展开

target: "/ContactSet('CO1')/MobilePhone"

很明显问题出在 sap.ui.core.message.Message 实例的目标上。 因此,我的问题是如何定位扩展元素的错误消息?

需要将处理器从oDataModel更改为ControlMessageProcessor。这意味着我们可以解决控件本身的问题,而不是模型中绑定数据的路径,以便将错误消息绑定到正确的显示位置。像这样:

var oMessageProcessor = new sap.ui.core.message.ControlMessageProcessor();
var oMessageManager  = sap.ui.getCore().getMessageManager();

oMessageManager.registerMessageProcessor(oMessageProcessor);

var oInput = new sap.m.Input({
    id: "myInputId",
    value: { path: "/Products(1)/Price" , type: new sap.ui.model.type.Float() }
});

oMessageManager.addMessages(
    new sap.ui.core.message.Message({
        message: "ZIP codes must have at least 23 digits",
        type: sap.ui.core.MessageType.Error,
        target: "/myInputId/value",
        processor: oMessageProcessor
     })
);

通过将控件本身作为目标,我们将扩展的 属性 绑定到控件并不重要。