代码之家  ›  专栏  ›  技术社区  ›  GoinOff

动态更改约束

  •  2
  • GoinOff  · 技术社区  · 15 年前

    我有一个dijit.form.numberTextBox输入字段,以这些参数开头:

     new dijit.form.NumberTextBox({
        id: din1,
        style: "width:60px",
        constraints: {
            places: 0,
            pattern: '######'
          }
        },
        din1);
    

    一切都很好……我的问题是我想在飞行中改变“位置”和“模式”参数。所以我写这个来改变“位置”和“模式”参数:

    var myFldObj = dijit.byId(din1);
    if (myFldObj) {
      var myConstObj = myFldObj.attr('constraints');
      if (myConstObj) {
         myConstObj.places = 2;
         myConstObj.pattern = '#####.0';
      }
    }
    

    所以,在我再次显示表单之后,我希望输入字段允许有2个小数位,但是表单的行为仍然像places=0和pattern='\当我检查“位置”和“模式”的值时,我得到了我想要的(2和.0)。我的问题:

    你能马上改变这些值吗??

    你必须销毁原来的dijit对象并用新参数重新创建吗??

    谢谢!!

    2 回复  |  直到 15 年前
        1
  •  1
  •   GoinOff    15 年前

    所以,这就是我的工作:

    首先,我认为这是一个bug,因为输入字段的开头

    new dijit.form.NumberTextBox({
        id: "fieldID",
        style: "width:60px",
        constraints: {
            places: 0
          }
        },
        "fieldID");
    

    然后在运行中用如下代码进行更改:

    注意:ntbarry-与HTML绑定的dijit.form.numberTextBox对象数组 输入标记ID。

    for (var x=0;x < ntbArry.length;x++) { 
      var handle = ntbArry[x];
      if (handle) {
        handle.attr('constraints').places = 2;
        handle.attr('constraints').pattern = '#####.0#';      
      } 
    }
    

    不显示与以这种方式创建的字段相同的行为(动态中没有约束mods):

    new dijit.form.NumberTextBox({
      id: "fieldID",
      style: "width: 60px",
      constraints: {
        places: 2,
        pattern: '#####.0#'
      }
    },
    "fieldID");
    

    它的行为很接近,但每次键入小数点时,都会弹出一条错误消息,说明输入无效。在最初创建的字段上键入小数点时,如果约束places=2且模式为“.0”,则不会弹出此消息。

    所以,为了获得我想要的原始行为:

    FieldIdEvents是一个Dojo事件数组,绑定到数字文本框字段。 在继续断开Dojo事件之前

    for (var x=0;x < fieldIDEvents.length;x++) {
      var handle = fieldIDEvents[x];
      if (handle) {    
        dojo.disconnect(handle);
      }
    }
    

    然后销毁数字文本框Dojo对象

    for (var x=0;x < ntbArry.length;x++) {
      var handle = ntbArry[x];
      if (handle) {
        handle.destroy();
        ntbArry[x] = null;
      }
    }
    

    接下来,将输入标记放回HTML中,因为它会被销毁:

    注意:td tag和应该包含输入标记的html td标记上的id。

    var fld1 = this.document.getElementById("tdtag");
    
    if (fld1) {
      //alert("\""+fld1.innerHTML+"\"");
      fld1.innerHTML = "<input id=\"fieldID\">";
    } 
    

    现在,再次创建NumberTextBox对象:

    ntbArry[0] = new dijit.form.NumberTextBox({
      id: "fieldID",
      style: "width: 60px",
      constraints: {
        places: 2,
        pattern: '#####.0#'
      }
    },
    "fieldID");
    

    这是一些额外的步骤,但是,至少我知道这对我来说是有用的。如果我遗漏了一些基本的东西,让我知道,很容易错过这些东西的小细节。

        2
  •  0
  •   Kniganapolke    15 年前

    我使用Dojo 1.3,我可以看到dijit.form.numberTextBox没有 pattern places 属性,但具有 editOptions 属性。所以我会尝试这样改变约束:

    myConstObj.editOption.places = 2;
    
    推荐文章