Выбор Dojo onChange увольнение события при изменении значения программно

У меня есть додзе (dijit) выбор, выпадающий, который вызывает js функцию onChange. Я ожидал, что это только вызовет onChange функцию, когда пользователь изменяет значение в выпадающем, однако, это даже вызывает onChange функцию, когда я программно изменяю значение выпадающего из кода js. Как я заставляю это только вызывать функцию, когда пользователь изменяет выпадающее значение? Это не должно вызывать функцию, когда я программно изменяю значение.

<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); 
    }
10
задан Cœur 16 November 2019 в 13:11
поделиться

2 ответа

Я думаю, что правильным исправлением в этом случае для вас будет 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.
0
ответ дан 4 December 2019 в 00:59
поделиться

Часто люди решают эту проблему, используя флаг priorityChange:

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

Это решит вашу проблему, за исключением тонких проблем, когда значение изначально равно 123, вы устанавливаете его программно на 456, а затем пользователь снова устанавливает его на 123, в в этом случае для действия пользователя также не будет события onChange ().

По этой причине вы можете дополнительно:

myWidget._lastValueReported=null;
11
ответ дан 4 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: