我有一个带有正则表达式绑定的sap.m.Input。当我的输入是" A"," B"或" C"我的文字是黑色的,否则它会通过CSS变成红色。
oComponent.attachValidationError(function(oEvent) {
oEvent.getParameter("element").addStyleClass("become-red");
});
oComponent.attachValidationSuccess(function(oEvent) {
oEvent.getParameter("element").removeStyleClass("become-red");
});
var oInput = new sap.m.Input( {
value: {
path: "Qux>/foo/0/bar/0/baz",
type: new sap.ui.model.type.String(null, {
search: new RegExp("^[ABC]$")
})
}
});
当值为" A"然后我将其更改为" B",这可以正常工作。
然后,如果我这样做
oModelQux.setProperty("/foo/0/bar", [{
"baz" : "A"}]);
这种方法正常,价值变为" A"再次。我的问题是当我将输入的值更改为一个不是全部的值时(例如" D"),然后我尝试我的代码
oModelQux.setProperty("/foo/0/bar", [{
"baz" : "A"}]);
没有任何反应。输入会自动更新为" A",它只留下字符串" D"红色。
答案 0 :(得分:2)
绑定应该避免错误的值存储在模型中。如果您更改" A"到" D"该值永远不会存储在模型中,即模型仍然保持" A"。因此,您对setProperty的调用无效,因为绑定的内部值从未更改过,并且setProperty在数据未更改的情况下不会强制更新绑定。 如果单击按钮并调用refresh(true),我建议您获取输入字段的绑定。这应该有效(未经测试)。
除此之外,我建议使用Select控件,因为看起来可用的值是固定的。这会使特殊逻辑过时。
答案 1 :(得分:0)
根据matbtt的回答,以下解决方案可以在不牺牲性能的情况下运行:
撤消单个条目('foo'级别)会触发以下事件:
oEventBus.publish("undo", "undoAll", oContext.getPath());
撤消所有行会触发以下事件:
oEventBus.publish("undo", "undoAll");
将以下更改功能附加到每个输入:
var oInput = new sap.m.Input( {
value: {
path: "Qux>/foo/0/bar/0/baz",
type: new sap.ui.model.type.String(null, {
search: new RegExp("^[ABC]$")
}),
change: function(oEvent){
var that = this;
var oRegex = new RegExp("^[ABC]$");
var bTest = oRegex.test(oEvent.getParameters().newValue);
if (!bTest) {
var fnSubscribe = function(sChannelId, sEventId, oData) {
if (!oData || oData === oContext.getPath()) {
that.mBindingInfos.value.binding.refresh(true);
that.removeStyleClass("invalid-value");
oComponent.getEventBus().unsubscribe("undo", "undoAll", fnSubscribe);
}
};
oComponent.getEventBus().subscribe("undo", "undoAll", fnSubscribe);
}
}
}
});