dojo选择onChange只能工作一次

时间:2014-07-11 06:57:58

标签: javascript select dojo onchange

我的Dojo小部件选择仅在第一次更改时触发。所有其他更改事件都不起作用。

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

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

1 个答案:

答案 0 :(得分: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/

相关问题