dijit/ Дерево не обновляется при подключении к додзё / магазину /JsonRest
Я изменил учебник по dojo по адресу 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({}));
(Если я удаляю Cache и использую JsonRest напрямую, даже измененный JsonRest.js не обновляет Tree).
Это ответ от запроса PUT на сервер json:
{"name":"New Child", "id":0.7243958345}
Пожалуйста, помогите разрешить dijit/Tree реагировать на изменения основного хранилища JsonRest, не возиться с источниками dojo.
Спасибо
Dominic
2 ответа
Решением было использование jquery вместо dojo. Я обнаружил, что могу за несколько часов изучения jquery решить все проблемы, возникающие при использовании dojo. Это происходит главным образом из-за качества документации обеих библиотек, а также из-за того, что в dojo слишком много ошибок, чтобы реагировать на новые сообщения об ошибках.
Попробуйте обернуть свой магазин 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 и передать эту информацию в дерево.