Обновление хранилища Dojo Dijit FilteringSelect с асинхронными данными - PullRequest
0 голосов
/ 16 февраля 2012

Я использую форму Zend + Dojo в контексте внутренней сети. Нам нужно обновить список округов, когда выбранное состояние изменяется в форме. При использовании HTML вы просто анализируете ответ json (или просто предоставляете html-фрагмент параметров) и обновляете innerhtml для выбора. Однако делать это в Додзё оказалось чрезвычайно сложно.

Короче говоря, я определил универсальный метод, который позволяет вам устанавливать обновление onBlur для поля формы. Это связано с действием Controller, которое вызывает базу данных с аргументами функции и возвращает либо одноэлементный ответ (который мы уже обработали нормально), либо ответ списка. Если мы вернемся к списку, нам нужно будет изменить параметры выбора с этим списком.

Пока все это прекрасно работает; мы получаем правильный ответ json с хорошим списком в response.data. Вот где проблема. Как я могу просто обновить существующее хранилище (проверка показывает, что это _comboBoxDataStore)? Я не могу объявить выбор с другим типом магазина, так как он генерируется автоматически.

Есть ли какой-нибудь способ грубой силы обменять магазины? Главный ключ в том, что все, что я делаю, должно работать в Internet Explorer; Я использую Firefox только для лучшего понимания объектов, с которыми я работаю.

В качестве дополнительного вопроса, кто-нибудь знает, почему _comboBoxDataStore не может быть обновлен? Другие фреймворки позволяют довольно плавно обновлять магазины, как, например, extJS. Существуют ли какие-либо причины для создания ограничения в поле со списком, чтобы оно не могло быть обновлено, что является шагом вниз по сравнению с необработанным HTML? Или я упускаю очевидное решение, которое не включает в себя манипулирование списком эзотерических объектов?

Ответы [ 4 ]

1 голос
/ 29 июня 2012

Исходя из сообщения RiverC, мой метод обновления комбо работает нормально:

, updateData : function(data) {
    var storeData = {data: data, id:'attrFilterStore'};
    var newStore = new dojo.data.ItemFileWriteStore({data: data});
    this.element.store = newStore;
    this.element.startup();
}

Где " this.element " - ссылка на FilteringSelect object.
Метод " updateData " является функцией обратного вызова из запроса ajax, который получает JSON со структурой RiverC.

0 голосов
/ 26 апреля 2013

Вы даже можете использовать опции.

var fldSelect = dijit.byId("fieldSelect");
fldSelect.options = fldoptions;
fldSelect.startup();

Где fldoptions - новые данные, которые необходимо заполнить.Имейте в виду: НЕ ЗАБЫВАЙТЕ НАЗВАТЬ fldSelect.startup(), иначе данные не будут обновляться.

0 голосов
/ 17 февраля 2012

Если у вас есть контроль над созданием _comboBoxDataStore, вы можете установить для clearOnClose значение true для этого хранилища. Затем вы можете закрыть это хранилище и установить атрибут url или data для новых данных (обратите внимание, что использование атрибута data после clearOnClose поддерживается только в dojo 1.4 и более поздних версиях). Это автоматически обновит виджет select / combobx новыми данными

для примера, смотрите: http://soularis999.blogspot.com/2011/03/reloading-dojodataitemfilereadstore.html

Если вы не можете установить clearOnClose (из-за того, что Zend-фреймворк владеет им без возможности изменить это поведение), вы можете создать новое хранилище данных и установить хранилище данных комбобокса во вновь созданное хранилище данных. dijit filteringselect и combobox предоставляют атрибут магазина, который вы можете изменить.

В качестве совершенно другого подхода вы можете захотеть изучить использование атрибута «query» виджетов-фильтрующих виджетов для таких сценариев - они очень полезны и сокращают объем кода и управления, которые вам нужно делать.

В приведенном ниже URL-адресе приведен пример того, как изменяется состояние в зависимости от выбора страны путем изменения фильтра запросов на фильтрующем элементе. http://livedocs.dojotoolkit.org/dijit/form/FilteringSelect

Кроме того, из вашего описания вариантов использования это выглядит как фильтрация dijit. Выбор может быть лучшим выбором виджета, чем выпадающий список (так как это список округов, вы хотите, чтобы пользователь мог вводить любой округ, отсутствующий в списке )

0 голосов
/ 17 февраля 2012

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

Убедитесь, что это где-то:

dojo.require("dojo.data.ItemFileWriteStore");

Затем, независимо от того, как возникла ваша фильтрация, вы можете сделать следующее:

newStore = new dojo.data.ItemFileWriteStore({
    data:{
         identifier: 'id',
         label: 'name',
         items: response.data
    }
});

filteringSelect.store = newStore;
filteringSelect.startup();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...