Javascript 与regex绑定不会在模型更新时触发
我有一个带有正则表达式绑定的sap.m.Input。当我的输入是“A”、“B”或“C”时,我的文本是黑色的,否则它会通过CSS变成红色Javascript 与regex绑定不会在模型更新时触发,javascript,regex,sapui5,Javascript,Regex,Sapui5,我有一个带有正则表达式绑定的sap.m.Input。当我的输入是“A”、“B”或“C”时,我的文本是黑色的,否则它会通过CSS变成红色 oComponent.attachValidationError(function(oEvent) { oEvent.getParameter("element").addStyleClass("become-red"); }); oComponent.attachValidationSuccess(function(oEvent) { oEvent.g
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”保留为红色。绑定应避免在模型中存储错误的值。如果将值从“A”更改为“D”,则该值永远不会存储在模型中,即模型仍保持“A”。因此,对setProperty的调用无效,因为绑定的内部值从未更改,并且setProperty不会在数据未更改的情况下强制绑定更新。 我建议您在单击按钮并调用refresh(true)时获得输入字段的绑定。这应该有效(未经测试)
除此之外,我建议使用Select控件,因为它看起来可用值是固定的。这将使特殊逻辑过时。根据matbtt的回答,以下解决方案在不牺牲性能的情况下工作: 撤消单个条目(“foo”级别)会触发以下事件:
oEventBus.publish("undo", "undoAll", oContext.getPath());
oEventBus.publish("undo", "undoAll");
撤消所有行将触发以下事件:
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);
}
}
}
});
在输入字段中输入值后,为什么要在模型上调用setProperty?@matbtt这适用于可以输入值的注册系统(例如,“a”表示缺席)。每行都有一个撤消按钮,该按钮使用setProperty刷新相关数据。如果有人键入一个无效的值,然后希望撤消该聚合(“/foo/0/bar”)的操作,我将发送一个AJAX请求以获取“/foo/0/bar”的当前有效值。然后,我使用setProperty试图让我的userinterface更新相关字段。根据您的回答,我选中了oModel.updateBindings(true),它可以工作。但是,屏幕包含数百到数千个输入,最终用户将通过这些输入按下“tab”以快速填写。因此,sap.m.Select控件在这种情况下没有任何用处,而oModel.updateBindings(true)为每个“撤消”操作增加了5秒。为了只刷新特定的输入,我首先必须定制一个系统,跟踪未通过正则表达式检查的sap.m.input字段。对于正确的分析和部分解决方案,我将给你+1。如前所述,您可以获取输入的绑定并刷新该特定绑定。我使用了您的建议来回答这个问题,但我仍然需要添加一些代码。很好,谢谢