Объяснение:
Я использую данные ember для моего проекта, и у меня есть вопрос, который вращается вокруг возможности загрязнения объекта, а затем устанавливает его состояние для очистки снова специально - без внесения изменений. Сценарий таков:
Скажем, что я получил объект через banana = App.Fruit.find('banana');
и в нем есть описание "Желтые фрукты!". Используя длинный опрос XHR (или WebSockets), я могу получить обновленную версию объекта из-за того, что другой пользователь изменил описание на "Вкусные желтые фрукты!". в любой момент времени после того, как я извлек исходный объект.
Тогда, что я хотел бы сделать, это обновить объект, чтобы отразить вновь полученные данные. Для этого я пробовал разные подходы:
-
Я пробовал звонить
App.Store.load(App.Fruit, new_data);
. Прежде всего, этот подход не работает, а во-вторых, это не совсем то, что я хочу. Я мог бы сделать незафиксированные изменения в самом объекте, и в этом случае было бы нежелательно просто отбрасывать их (предполагая, что вызовload()
перезапишет их). -
Я пробовал перебирать новые данные, вызывая
.set()
- так:banana.set('description', new_data.description);
- чтобы обновить свойства объекта новыми данными (где применимо = не грязно). Это работает, но он оставляет объект в загрязненном состоянии.
Чтобы сделать объект чистым/обновленным снова - и не, адаптер адаптирует изменения! - Я взглянул на состояния, через которые проходит объект. Это (по крайней мере):
- Шаг 1: Изначально объект находится в состоянии
rootState.loaded.saved
. - Шаг 2: Вызов
.set()
в свойстве подталкивает его в состояниеrootState.loaded.updated.uncommitted
. - Шаг 3: Вызов
App.store.commit();
возвращает объект в состояниеrootState.loaded.saved
.
Поэтому я попытался вручную установить состояние объекта на saved
после шага 2 следующим образом: banana.get('stateManager').goToState('saved');
.
Однако это не работает. В следующий раз, когда магазин совершит по любой другой причине, этот маневр вызывает inFlightDirtyReasons - ошибка undefined.
Вопрос:
Мой вопрос: как я могу вручную изменить состояние загрязненного объекта обратно, чтобы снова очистить (сохранить)?