2014-07-11 2 views
0

My Dojo widget 첫 번째 변경 사항에 의해서만 발동을 선택하십시오. 다른 모든 변경 이벤트는 아무 것도 수행하지 않습니다.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"); 
    } 
}); 

는 각각의 onChange 트리거를해야하는 두 사용자의 ID 등록 정보를 확인합니다 케이스. 또한 JSFiddle을 업데이트했습니다 : http://jsfiddle.net/gxy2G/3/