dijit/Tree не обновляется при подключении к dojo/store/JsonRest

Я изменил руководство по додзё по адресу http://dojotoolkit.org/documentation/tutorials/1.10/store_driven_tree/demo/demo.html для чтения из хранилища JsonRest.

Проблема в том, что отображение дерева не обновляется, когда я нажимаю «Добавить новый дочерний элемент к выбранному элементу», например. на корневом элементе, хотя обновление работало в исходном руководстве.

Я сравнил, что возвращают dojo/store/Memory (из исходного руководства) и dojo/store/JsonRest после запроса «put»: Memory возвращает идентификатор нового объекта. JsonRest заканчивается «return xhr(...)», поэтому он возвращает Deferred вместо нового идентификатора, который, похоже, не понимается Observable. Я могу заставить это работать, если я изменю dojo/store/JsonRest.js на конец:

  ...
  return xhr(...).then(function(data){
    return data.id;
  };
}

Надеюсь есть решение без модификации исходников додзё?!

Далее следуют некоторые подробности:

Это определение моего хранилища вместо исходного хранилища памяти:

var governmentStore = new JsonRest({
  target : "http://localhost:8080/test/gov",
  getChildren : function(object) {
    return this.query({
      parent : object.id
    });
  }
 });
 var governmentStore = new Cache(governmentStore,new Memory({}));

(Если я удаляю кэш и использую JsonRest напрямую, даже модифицированный JsonRest.js не обновляет дерево).

Это ответ на запрос PUT на сервер json:

{"name":"New Child", "id":0.7243958345}

Пожалуйста, помогите разрешить dijit/Tree реагировать на изменения базового хранилища JsonRest, не возясь с исходными кодами dojo.

Спасибо

Доминик


person Dominic    schedule 02.06.2015    source источник


Ответы (2)


Попробуйте обернуть хранилище JsonRest обёрткой Observable и посмотреть, помогает правильному обновлению дерева. Также убедитесь, что модель дерева работает правильно, поскольку это то, что должно обрабатываться, когда и где дерево обновляется, прослушивая хранилище.

var memStore = new Memory({});
var store = new Observable(memStore); //Use this store for your tree
var cacheStore = new Cache(governmentStore,memStore);

Идея здесь в том, что когда вы делаете PUT, вы должны помещать в cacheStore, а не в GovernmentStore. Кэш выполнит PUT в GovernmentStore, но также обновит memStore, когда PUT завершится, что должно вызвать уведомление в Observable и передать эту информацию дереву.

person Richard    schedule 03.06.2015
comment
JsonRest IS завернут в Observable, если вы проверите исходный код демонстрации, связанный выше. Единственное отличие состоит в том, что я заменил в демо-версии GovernmentStore=new Memory(...) на GovernmentStore=new JsonRest(...); GovernmentStore=новый Кэш(governmentStore,...);. Как проверить правильность работы модели? Все проверки показывают, что хранилище JsonRest возвращает те же данные, что и исходная демонстрация. - person Dominic; 03.06.2015
comment
Как я уже писал, разница в том, что запрос PUT к JsonRest возвращает Deferred, тогда как запрос PUT к памяти возвращает идентификатор нового элемента. По-видимому, это ошибка или, по крайней мере, несовместимость между хранилищами данных додзё. - person Dominic; 03.06.2015
comment
Да, вы правы в том, что Observable и JsonRest плохо работают вместе. Я забыл, что у JsonRest нет механизма запросов (поскольку ожидается, что сервер будет обрабатывать некоторые аспекты обычного механизма запросов). Я думаю, что здесь вам нужно поместить Observable вокруг памяти, так как это фактическое хранилище, которое обновляется. Я немного обновил свой ответ, чтобы показать, что, по моему мнению, должно работать. - person Richard; 03.06.2015
comment
Если я последую вашему предложению, я получу ошибку: dijit.tree.ObjectStoreModel: корневой запрос вернул 0 элементов, но должен вернуть ровно один. На сервер не отправляется запрос, чего и следовало ожидать, поскольку дерево работает с пустым хранилищем памяти. Если у кого-то нет решения, я отправлю отчет об ошибке и буду использовать модифицированные источники додзё (см. мой первоначальный ответ) в качестве обходного пути, хотя это будет боль в заднице. - person Dominic; 03.06.2015

Использование jquery вместо dojo было решением. Я обнаружил, что могу решить за несколько часов изучения jquery все проблемы, возникающие при использовании dojo. В основном это связано с качеством документации обеих библиотек, а также с тем, что в dojo слишком много ошибок, чтобы реагировать на новые отчеты об ошибках.

person Dominic    schedule 04.06.2015