2010-07-12 15 views
10

Ho un menu a discesa di selezione dojo (dijit) che chiama una funzione js su Change. Mi aspettavo che questo chiamasse la funzione onChange solo quando l'utente cambiava il valore nel menu a discesa, tuttavia, chiama anche la funzione onChange quando cambio programaticamente il valore del menu a discesa dal codice js. Come faccio a richiamare la funzione solo quando l'utente cambia il valore del dropdown? Non dovrebbe chiamare la funzione quando cambio il valore in modo programmatico.Dojo Selezionare onChange evento che si attiva quando si modifica il valore in modo programmatico

<select jsId="ddlBoundaryType" id="ddlBoundaryType" name="ddlBoundaryType" 
          dojoType="dijit.form.Select"> 
          <option value="0">Circle</option> 
          <option value="1">Polygon</option> 
         </select> 

dojo.addOnLoad(InitBoundaries); 
    function InitBoundaries() { 
     dojo.connect(dijit.byId("ddlBoundaryType"), 'onChange', Boundaries_ChangeBoundaryType); 
    } 

Grazie, Justin

+0

Potresti pubblicare il codice che modifica in modo programmatico il valore del menu a discesa? – Abboq

+0

dijit.byId ("ddlBoundaryType"). Attr ('valore', 0); – Justin

risposta

0

penso che la correzione adeguata in questo caso per voi sarebbe http://bugs.dojotoolkit.org/ticket/10594, dal momento che tratta direttamente con dijit.form.Select. Certo, ci sono alcuni modi per risolvere questo problema.

  1. Aggiornamento dojo :).
  2. Inherit dijit.form.Selezionare e "patchare" la funzione _updateSelection.
  3. Estendi dijit.form.Seleziona e "patch" direttamente lì.

Non rinuncerò al primo. Il secondo e il terzo metodo sono simili, quindi mi limiterò a pubblicare una semplice correzione utilizzando la terza via,

dijit.form.Select.extend({ 
    _updateSelection: function() { 
     this.value = this._getValueFromOpts(); 
     var val = this.value; 
     if(!dojo.isArray(val)){ 
      val = [val]; 
     } 
     if(val && val[0]){ 
      dojo.forEach(this._getChildren(), function(child){ 
       var isSelected = dojo.some(val, function(v){ 
        return child.option && (v === child.option.value); 
       }); 
       dojo.toggleClass(child.domNode, this.baseClass + "SelectedOption", isSelected); 
       dijit.setWaiState(child.domNode, "selected", isSelected); 
      }, this); 
     } 
    } 
}); 

Si noti che non ho scritto questa funzione, ho felicemente plagiato dal codice sorgente con l'ultimo linea, this._handleOnChange (this.value) rimosso.

myWidget.attr('value', newValue, false) // should now work without firing onChange. 
+0

# 1 non è un'opzione in quanto il dojo è la versione 1.5 e questo sta andando in 1.6. Darei uno sguardo al numero 3, grazie! – Justin

+0

Blah, non ho notato che era per 1.6, boo me! –

11

Spesso le persone a risolvere questo utilizzando il flag priorityChange:

myWidget.set("value", 1234, false); 

che risolverà il vostro problema, tranne per le questioni sottili, dove il valore è di origine 123, è possibile impostare programmaticamente su 456, quindi l'utente lo imposta su 123, nel qual caso non ci sarà neanche un evento onChange() per l'azione dell'utente.

Per questo motivo è possibile inoltre fare:

myWidget._lastValueReported=null; 
+0

"set" non è una funzione, ho provato dojo.byId, dijit.byId, e questo per accedervi e nessuno di loro ha quella funzione disponibile. – Justin

+0

_Widget.set() è una nuova funzione in 1.5. Pre-1.5 è stato chiamato attr(). Si noti che questo problema è stato risolto in http://bugs.dojotoolkit.org/ticket/10988, per dojo 1.6, ma poiché non verrà rilasciato per un po ', provare la soluzione sopra descritta. –

+0

Grazie, ma sfortunatamente non funziona (almeno nel dojo 1.4.2.) L'impostazione del terzo parametro di .attr() su false non ha avuto alcun effetto, tuttavia chiama l'evento onchange. Inoltre, l'impostazione di _lastValueReported = null richiama l'evento onchange una seconda volta ... – Justin

0

Un modo molto più semplice è che, vorrei suggerire il flag "_onChangeActive", che non è raccomandato per essere utilizzato, in quanto è serve scopo interno. Ma, se richiesto, potremmo usarlo. "_onChangeActive" è un flag presente nel dojo Seleziona i widget del tipo, che per impostazione predefinita è impostato su true. Se questo flag è impostato su true, l'evento onChange viene attivato normalmente. Tuttavia, quando è impostato su false, l'evento onChange non viene attivato, quando il valore viene modificato dall'utente o programmaticamente.

es:

var widget = registry.byId('widget_id'); 
widget.set('_onChangeActive', false); // setting the flag to false 
...//make changes to the select programatically 
widget.set('_onChangeActive',true); // setting back to true after programatic changes are done 

Non c'è bisogno di ereditare la funzionalità dojo esistente per questo o utilizzare bandiere esterni separati. Il widget ne ha uno integrato per questo: "_onChangeActive".

Problemi correlati