Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.06.2015, 21:54
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Отключение Ext.data.Model.identifier
Здравствуйте!

Можно ли выключить генератор ключей Ext.data.Model.identifier для модели?

Более подробно вопрос:

Цитата:
В классе Ext.data.Model есть параметр identifier:

http://docs.sencha.com/extjs/5.1/5.1...cfg-identifier

Когда я создаю новую запись, то этот генератор генерирует новое значение для поля id.

В итоге, при вызове метода model.save() на сервер отправляются данные поле, в числе которых и id. А на сервере id не нужен, так как сервер при создании новой записи сам генерирует id.

Как мне выключить этот генератор?
Ответить с цитированием
  #2 (permalink)  
Старый 04.06.2015, 00:30
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Если я правильно понимаю ваш вопрос, то генератор не нужно выключать. При создании записи (экземпляра модели) ей присваивается внутренний id и статус фантомной, т.е. не существующей на сервере.

Когда Store отправляет записи на сервер, они передаются с фантомным id. Нормальный протокол со стороны сервера, в цикле по каждой записи:
  1. Сохраняем переданный фантомный id в переменную
  2. Пишем запись в базу
  3. Создаём объект для возврата
  4. Реальный сгенерированный базой id возвращаем в поле idProperty
  5. Старый фантомный id возвращаем в поле clientIdProperty
  6. Сохраняем возвратный объект в массив для возврата и идём к следующей записи

Такой же механизм будет использоваться и для отдельных экземпляров моделей, без Store. Смотрите документацию: http://docs.sencha.com/extjs/5.1/5.1...ientIdProperty

Ещё могу предложить посмотреть пример (более/менее) правильной реализации CRUD: https://github.com/nohuhu/HTML5-Star...Direct/Base.pm. Я над этим проектом потихоньку работаю в свободное время. Это не PHP, но при желании разберётесь. ;)
Ответить с цитированием
  #3 (permalink)  
Старый 04.06.2015, 11:38
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

спасибо за ответ - буду разбираться

а зачем вообще нужен этот фантомным id тогда?
Ответить с цитированием
  #4 (permalink)  
Старый 08.06.2015, 07:54
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Записи, хоть и фантомные, идентифицировать как-то надо. Например, для вывода в Grid. Кроме того, фантомные записи могут вообще никогда не получить реальный идентификатор, если их на сервер не сохранят или сервер отобьёт попытку сохранения. Все операции с записями отслеживаются по внутреннему id, который может не совпадать с "реальным".
Ответить с цитированием
  #5 (permalink)  
Старый 14.03.2016, 21:14
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

nohuhu

Спасибо за подробные разъяснения! А дальше то как быть? Вот клиент получил свой старый фантомный id, нашел node с этим id и что? Сделал node.setId(newId)? Node станет dirty и будет отправлен серверу для апдейта в ближайший store.sync()... И по что оно нам такое? Апдейтить то в этом node попросту нечего! Как быть?

Буду благодарен за разъяснения.
Ответить с цитированием
  #6 (permalink)  
Старый 14.03.2016, 22:53
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

@AirGraph,

Если сервер соблюдает конвенции и отвечает на запрос сохранения массивом с правильной привязкой clientId -> id, то Store отработает такой ответ самостоятельно и снимет фантомный флаг с сохранённых записей. В грязное состояние такие записи попадать не должны, как раз наоборот.

Можете воспроизвести проблему в Fiddle?
Ответить с цитированием
  #7 (permalink)  
Старый 15.03.2016, 00:49
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

@nohuhu

Спасибо за пояснения.

У меня не сервер, а так, кое-какой модуль в Node JS, который мало-мало что-то читает/пишет в mongoDB. Я пытался по Вашей рекомендации возвращать запросу store.sync() JSON, содержащий id и clientId - treeStore никак на это не реагирует. Реально присвоенные в mongoDB id_ы не становятся таковыми в treeStore...

Начинать мне наверное надо не с публикации кода, а с прочтения доков на тему - как корректно организовать связь между treeStore и веб-сервером. Если оно где-то описано, поделитесь пожалуйста ссылкой. Возможно я чего-то базового не понимаю, от того у меня и вопросы такие странные... :-)
Ответить с цитированием
  #8 (permalink)  
Старый 15.03.2016, 14:21
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

@nohuhu

С десятого раза вроде как заработало. С двумя оговорками:

1. В ответе сервера id должен быть указан именно так, как он определен в модели. Т.е. если в модели idProperty: '_id', то и в ответе сервера должно быть {_id: serverDefinedId, clientId: phantomExtId}. Ответ типа {idProperty: serverDefinedId, clientId: phantomExtId} не канает, что совсем не есть гуд... :-)

2. Порядок перечисления элементов в массиве ответа не обратный, как написано вот тут: http://docs.sencha.com/extjs/5.1/5.1...ientIdProperty, а прямой.

Доку на протокол обмена данными TreeStore с сервером хотелось бы увидеть в любом случае.

Спасибо.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отключение скрипта при определенном разрешении. Нарек Events/DOM/Window 11 02.07.2014 15:22
Отключение горизонтального скроллинга kirilvlasuk Events/DOM/Window 1 25.06.2014 14:00
Отключение SCROLL в окне браузера при D&D realus Events/DOM/Window 3 10.10.2011 18:24
Отключение всех событий от элемента uraf78 Общие вопросы Javascript 5 07.07.2011 16:41
отключение функции в определённом месте andrwe Общие вопросы Javascript 11 02.05.2011 20:19