10

我有一个调用 js 函数 onChange 的 dojo (dijit) 选择下拉菜单。我希望这只会在用户更改下拉列表中的值时调用 onChange 函数,但是,当我以编程方式从 js 代码更改下拉列表的值时,它甚至会调用 onChange 函数。当用户更改下拉值时,如何让它只调用该函数?当我以编程方式更改值时,它不应该调用该函数。

<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); 
    }
4

3 回答 3

11

人们通常通过使用 priorityChange 标志来解决这个问题:

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

这将解决您的问题,除了值最初为 123 的细微问题,您以编程方式将其设置为 456,然后用户将其设置回 123,在这种情况下,用户操作不会有 onChange() 事件任何一个。

因此,您还可以执行以下操作:

myWidget._lastValueReported=null;
于 2010-07-15T02:31:13.390 回答
0

我认为在这种情况下对您来说正确的解决方法是http://bugs.dojotoolkit.org/ticket/10594,因为它直接处理 dijit.form.Select。当然,有几种方法可以解决这个问题。

  1. 升级道场:)。
  2. 继承 dijit.form.Select 并“修补” _updateSelection 函数。
  3. 扩展 dijit.form.Select 并直接在此处“修补”它。

我会放弃第一个。第二种和第三种方法类似,所以我将使用第三种方法发布一个简单的修复,

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);
        }
   }
});

注意这个函数不是我写的,我很高兴的从源码中抄袭了最后一行,去掉了this._handleOnChange(this.value)。

myWidget.attr('value', newValue, false) // should now work without firing onChange.
于 2010-08-18T06:49:55.353 回答
0

一个更简单的方法是,我想建议使用“_onChangeActive”标志,不建议使用它,因为它用于内部目的。但是,如果需要,我们可以使用它。"_onChangeActive" 是 dojo Select 类型小部件中存在的标志,默认设置为 true。如果此标志设置为 true,则将照常触发 onChange 事件。但是,当它设置为 false 时,不会触发 onChange 事件,当值由用户或以编程方式更改时。

例如:

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

无需为此继承现有的 dojo 功能或使用单独的外部标志。该小部件为此内置了一个 - “_onChangeActive”。

于 2013-09-06T13:00:31.263 回答