2014-07-11 41 views
0

我的Dojo小部件选择仅在第一次更改时触发。所有其他变更事件什么也不做。dojo选择onChange只能使用一次

 var selectServerAddServices = new Select({ 
      name : "selectServer_forAddService", 
      style : { 
       width : '180px' 
      }, 
      onChange: function() { 
        alert("test "); 
       } 
     }); 

可能是什么问题? 选择的选项由商店设置。

+0

如果您使用'selectServerAddServices.on(“change”,cunction(){})''它是同样的事情吗? – dgiugg

+0

是其同样,无论是方式的dosent工作 – user3808286

+0

看起来你做错了什么,则:http://jsfiddle.net/gxy2G/ – g00glen00b

回答

0

您不能将对象用作ID。屏幕背后发生的是,当您更改dijit/form/Select的值时,它将首先通过使用dijit/form/Select::compare()函数验证旧值是否与新值不同。这个功能实现为:

compare: function(/*anything*/ val1, /*anything*/ val2){ 
    if(typeof val1 == "number" && typeof val2 == "number"){ 
     return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2; 
    }else if(val1 > val2){ 
     return 1; 
    }else if(val1 < val2){ 
     return -1; 
    }else{ 
     return 0; 
    } 
} 

这意味着,为了有所不同,您的ID必须是比以前的ID较小或较大。

但是,当你比较的对象,这是不行的,例如:

var a = { id: 1 }; 
var b = { id: 2 }; 
a < b; // Returns false 
b < a; // Returns false 

所以,即使属性是不同的,比较始终返回false,那么这两个对象都被视为“平等” ,这意味着onChange事件未被触发。


为了解决这个问题,你必须改变compare()功能的实现,例如:

var selectServerAddServices = new Select({ 
    name : "selectServer_forAddService", 
    style : { 
     width : '180px' 
    }, 
    compare: function(val1, val2) { 
     return (val1.id1 - val2.id1) + (val1.id2 - val2.id2); 
    }, 
    onChange: function() { 
     alert("test"); 
    } 
}); 

现在将同时检查你的ID属性,这应使onChange触发器在每个案件。我也更新了JSFiddle:http://jsfiddle.net/gxy2G/3/