Dojo在以编程方式更改值时选择onChange事件触发

时间:2010-07-12 15:27:41

标签: dojo dijit.form

我有一个dojo(dijit)选择下拉列表,它调用js函数onChange。我希望这只在用户更改下拉列表中的值时调用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); 
    }

谢谢, 贾斯汀

3 个答案:

答案 0 :(得分:11)

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

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

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

因此你可以另外做:

myWidget._lastValueReported=null;

答案 1 :(得分:0)

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

  1. 升级道场:)。
  2. 继承dijit.form.Select并“修补”_updateSelection函数。
  3. 扩展dijit.form.Select并直接在那里“修补”。
  4. 我会放弃第一个。第二种和第三种方法是类似的,所以我将使用第三种方式发布一个简单的修复,

    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.
    

答案 2 :(得分:0)

更简单的方法是,我想建议使用“_onChangeActive”标志,不建议使用,因为它是用于内部目的。但是,如果需要,我们可以使用它。 “_onChangeActive”是dojo中的标志选择类型小部件,默认情况下设置为true。 如果此标志设置为true,则会像往常一样触发onChange事件。但是,当它设置为false时,当用户或编程地更改值时,不会触发onChange事件。

e.g:

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”。