Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 与regex绑定不会在模型更新时触发_Javascript_Regex_Sapui5 - Fatal编程技术网

Javascript 与regex绑定不会在模型更新时触发

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

我有一个带有正则表达式绑定的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”保留为红色。

绑定应避免在模型中存储错误的值。如果将值从“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。如前所述,您可以获取输入的绑定并刷新该特定绑定。我使用了您的建议来回答这个问题,但我仍然需要添加一些代码。很好,谢谢