2014-07-11 22 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/