使用正则表达式绑定不会触发模型更新

时间:2015-09-15 12:26:29

标签: 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.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"红色。

2 个答案:

答案 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);
            }
         }
       }
    });