Расширение Dijit.tree с переключателями, отправляющими неправильное значение

Я написал класс, который расширяет dijit.Tree, чтобы включить переключатель рядом с каждым узлом. Я использую его в форме, чтобы показать дерево папок, из которого пользователь может выбрать папку. Вот код:

define("my/Tree/RadioButton",
    ['dojo/_base/declare', 'dijit/Tree', 'dijit/form/RadioButton', 'dojo/dom-construct', 'dojo/_base/connect', 'dojo/on', 'dojo/_base/lang'],
    function (declare, Tree, RadioButton, domConstruct, connect, on, lang){

    var TreeNode = declare(Tree._TreeNode, {
        _radiobutton: null,

        postCreate: function(){
            this._createRadioButton();

            this.inherited(arguments);
        },

        _createRadioButton: function(){
            this._radiobutton = new RadioButton({
                name: this.tree.name,
                value: this.tree.model.store.getIdentity(this.item) + '',
                checked: false
            });
            domConstruct.place(this._radiobutton.domNode, this.iconNode, 'before');

            if (this.tree.model.store.hasAttribute(this.item, 'checked')) {
                var attrValue = this.tree.model.store.getValue(this.item, 'checked');
                if (attrValue === true) {
                    this._radiobutton.set('checked', true);
                }
            }

            connect.connect(this._radiobutton, 'onClick', this, function(){
                // set any checked items as unchecked in the store
                this.tree.model.store.fetch({
                    query: {checked: true},
                    onItem: lang.hitch(this.tree.model.store, function(item){
                        console.log('found checked item ' + this.getValue(item, 'name'));
                        this.setValue(item, 'checked', false);
                    })
                });

                // check the one that was clicked on
                var radioValue = this._radiobutton.get('value');
                this.tree.model.store.setValue(this.item, 'checked', true);
            });
        }
    });

    return declare(Tree, {
        _createTreeNode: function(/*Object*/ args){
            return new TreeNode(args);
        }
    });
});

Проблема заключается в том, что при отправке формы отправляемое значение всегда является значением первого выбранного переключателя, даже если впоследствии были нажаты другие переключатели.

Я вижу, проверяя дом, что атрибут value для проверенного переключателя имеет правильное значение. Но то, что передается, всегда является изначально выбранным значением.

У меня есть аналогичный класс, который вместо этого использует виджет флажка, и он отлично работает.

Изменить, основываясь на некоторых отзывах, я создал еще более простую версию этого класса, которая не отслеживает проверенное состояние с помощью атрибута в магазине:

define("my/Tree/RadioButton",
    ['dojo/_base/declare', 'dijit/Tree', 'dijit/form/RadioButton', 'dojo/dom-construct'],
    function (declare, Tree, RadioButton, domConstruct){

    var TreeNode = declare(Tree._TreeNode, {
        _radiobutton: null,

        postCreate: function(){
            this._createRadioButton();

            this.inherited(arguments);
        },

        _createRadioButton: function(){
            this._radiobutton = new RadioButton({
                name: this.tree.name,
                value: this.tree.model.store.getIdentity(this.item) + '',
                checked: false
            });
            domConstruct.place(this._radiobutton.domNode, this.iconNode, 'before');
        }
    });

    return declare(Tree, {
        _createTreeNode: function(/*Object*/ args){
            return new TreeNode(args);
        }
    });
});

но даже это все еще имеет ту же проблему - какой бы переключатель пользователь не нажимал первым, это значение, которое будет отправлено, независимо от того, какие другие кнопки были нажаты впоследствии.


person Tim Fountain    schedule 25.01.2013    source источник


Ответы (2)


Мне удалось обойти эту проблему, подключившись к событию onchange для переключателей. Хук явно устанавливает значение «checked» в «false» для неотмеченной кнопки-переключателя, что, кажется, решает проблему. Я не уверен, почему это требуется, хотя.

person Tim Fountain    schedule 31.01.2013

У меня точно такая же проблема. Раньше это работало в старых додзё. В частности, ВСЕ радиокнопки неправильно возвращают значение true на "dijit.byId("whatever").checked" во время функции onClicked. При проверке вручную после завершения функции onClicked с помощью консоли FireBug указанное выше свойство возвращает правильные значения. Я думаю, что это ошибка, и я работал только с ней, используя разные функции onClicked для каждой кнопки, например:

<form id="locateForm">
<label for="locate">Locate:</label><br />
<input type="radio" dojoType="dijit.form.RadioButton" name="locate" id="locateAddress" value="Address" checked="checked" onClick="enableLocate1();" />
<label for="locateAddress">Address</label>
<input type="radio" dojoType="dijit.form.RadioButton" name="locate" id="locatePlace" value="Place" onClick="enableLocate2();" />
<label for="locatePlace">Place</label>
</form>
person Zack Stauber    schedule 01.03.2013