Dojo выберите раскрывающийся список при расширении, изменяющем значение по умолчанию

введите описание изображения здесьЯ устанавливаю значение по умолчанию для Dojo, выбирая раскрывающийся список, т.е. id =-999 из объекта json. Это отлично работает, но при нажатии на поле выбора при расширении значение по умолчанию меняется на вторую позицию, а id= 29 устанавливается как значение по умолчанию (первое положение). Эта проблема возникает в основном в браузере Chrome. Прикреплены изображения объекта json и поведения пользовательского интерфейса.

Заранее спасибо . введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения


person user1516871    schedule 03.12.2014    source источник
comment
Я думаю, вам нужно поделиться некоторым кодом, чтобы получить дополнительную помощь. Видите ли вы такое же поведение в этом примере? jsfiddle.net/froden/oqjym25f   -  person Frode    schedule 03.12.2014


Ответы (1)


Вам нужно добавить labelAttr при установке store, например.

new Select({
    store: new MemoryStore({ data: g_data(), getLabel: function(o) {return o.label;} }),
    labelAttr: "label",
    value: "-999",
    onChange: function(v) { document.getElementById("output").innerHTML = "Selected " + v; }
}).placeAt("container").startup();

См. здесь: http://jsfiddle.net/k63h12ux/2/

Если вы не хотите, чтобы ярлыки сортировались, добавьте sortByLabel: false. Это также решит эту проблему.

new Select({
    store: new MemoryStore({ data: g_data(), getLabel: function(o) {return o.label;} }),
    sortByLabel: false,
    value: "-999",
    onChange: function(v) { document.getElementById("output").innerHTML = "Selected " + v; }
}).placeAt("container").startup();

См. здесь: http://jsfiddle.net/z4w0bx9k/1/

Причина этой проблемы кроется в следующей строке из dijit.form._FormSelectWidget . Если labelAttr не указан, а значение по умолчанию sortByLabel установлено на true, товары из магазина будут храниться с использованием неправильных условий и, следовательно, будут иметь неправильный порядок.

var labelAttr = this.labelAttr;
items.sort(function(a, b){
    return a[labelAttr] > b[labelAttr] ? 1 : b[labelAttr] > a[labelAttr] ? -1 : 0;
});

В документе dijit.form._FormSelectWidget также говорится:

Если установлено store, labelAttr также должен быть установлен, если только store не является хранилищем dojo.data в старом стиле, а не новым dojo/store.

person Alex Cheng    schedule 05.12.2014
comment
Спасибо за ответ, на самом деле labelAttr: label, value: -999, sortByLabel: false, эти три строки кода исправили мою проблему. - person user1516871; 09.12.2014