Dojo 动态更改约束

Dojo 动态更改约束,dojo,dijit.form,Dojo,Dijit.form,我有一个dijit.form.NumberTextBox输入字段,它以以下参数开头: new dijit.form.NumberTextBox({ id: din1, style: "width:60px", constraints: { places: 0, pattern: '######' } }, din1); 一切都很好。我的问题是我想在飞行中改变“位置”和“模式”参数。所以我写这篇文章是为了改变“

我有一个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=''。当我检查“places”和“pattern”的值时,我得到了我所期望的值(2和0)。我的问题:

你能随时更改这些值吗

您是否必须销毁原始dijit对象并使用新parms重新创建


谢谢

我使用Dojo 1.3,我可以看到dijit.form.NumberTextBox没有
模式
位置
属性,但有
编辑选项
属性。因此,我将尝试更改如下约束:

myConstObj.editOption.places = 2;

因此,以下是对我有效的方法:

首先,我认为这是一个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#';      
  } 
}
它的行为非常接近,但每次键入小数点时,都会弹出错误消息,说明输入无效。在最初使用约束places=2和模式“######.0”创建的字段上键入小数点时,不会弹出此消息

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

FieldIdeEvents是绑定到NumberTextBox字段的dojo事件数组。 在继续之前,请断开dojo事件

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

这是一些额外的步骤,但至少我知道这对我来说是有效的。如果我缺少一些基本的东西,请告诉我,很容易错过这些东西的小细节。

其他信息:更改限制后,当我键入“1”时。输入字段在我键入“1”后会弹出一条无效消息。”。但是,如果我在字段外键入“1”和制表符,则不会出现错误消息,并且它会将其格式化为我预期的“1.00”。那么,这是一只虫子吗???还是我遗漏了什么???更奇怪的是:键入“1.0”选项卡会在应该只添加零(1.00)时创建错误消息。当我键入“1.1”选项卡时,它将正确格式化(1.10)-无错误消息。Java数字模式本身非常复杂,而且没有很好地指定。我认为你需要在整个部分中有一个固定的“0”,如果你手动设置位置,为什么不在小数点中使用“#”,比如“#####0.####”呢?那么你只需要更改“位置”或“模式”,而不是两个都更改?当这些参数动态更改时,字段的行为方式就不一样了。请参阅下面我的文章…模式和位置位于约束对象上,它本身是NumberTextBox的一个属性。editOptions受保护,仅用于在编辑时格式化值。您应该在bugs.dojotoolkit.org上提交一份报告。我将为此提交一份bug报告。我忘了提到我正在使用1.3.2,昨天刚刚升级到1.4.2,我仍然看到相同的行为。此外,我修改了constaints,使其仅使用“模式:”####.00”,而不设置“位置”属性。因此,通过从一个带有模式“#######”的NumberTextBox开始,然后动态地将模式更改为“####.00”(不需要“位置”),可以很容易地创建bug。
for (var x=0;x < fieldIDEvents.length;x++) {
  var handle = fieldIDEvents[x];
  if (handle) {    
    dojo.disconnect(handle);
  }
}
for (var x=0;x < ntbArry.length;x++) {
  var handle = ntbArry[x];
  if (handle) {
    handle.destroy();
    ntbArry[x] = null;
  }
}
var fld1 = this.document.getElementById("tdtag");

if (fld1) {
  //alert("\""+fld1.innerHTML+"\"");
  fld1.innerHTML = "<input id=\"fieldID\">";
} 
ntbArry[0] = new dijit.form.NumberTextBox({
  id: "fieldID",
  style: "width: 60px",
  constraints: {
    places: 2,
    pattern: '#####.0#'
  }
},
"fieldID");