Ember JS, ошибка при синтаксическом анализе данных в событии обработки Transformer `didCommit` в состоянии root.loaded.updated.uncommitted."

Я получаю сообщение об ошибке в Ember Transformer, пытающемся проанализировать дату в функции сериализации.

Сообщение об ошибке: «Попытка обработать событие didCommit в ‹(подкласс DS.Model):ember1597:8260357> в состоянии root.loaded.updated.uncommitted».

Как ни странно, данные передаются корректно разобранные на сервер.

Код:

DS.Transform.extend({

    deserialize : function(serialized) {

        var array = [];

        if (Ember.isArray(serialized)) {

            serialized.forEach(function(item) {
                if (item.feldTyp === "DATE_FIELD" && item.value) {
                    Ember.set(item, "value", moment(item.value, "DD.MM.YYYY"));
                }
                array.addObject(Ember.Object.create(item));
            });
        }

        return array;
    },

    serialize : function(deserialized) {
        if (Ember.isArray(deserialized)) {
            deserialized.forEach(function(item) {
                if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) {
                    item.set('value', moment(item.get('value')).format("DD.MM.YYYY"));
                }
            });
            return deserialized;
        }

        return [];
    }
});

Строка item.set('value', moment(item.get('value')).format("DD.MM.YYYY")); вызывает ошибку, поскольку закомментированная ошибка исчезает. Я пробовал другие вещи, такие как установка статического значения или установка значения с помощью Ember.set, но безуспешно. Я не совсем знаю, что здесь пошло не так, и поэтому не могу придумать решение. Кто-нибудь может помочь? Заранее спасибо.

изменить

Обходной путь: я переместил сериализацию в контроллер. Выглядит не так элегантно, но пока работает...


person Redfox    schedule 11.02.2014    source источник


Ответы (1)


Как вы поняли, ember data не любит использование set в своих преобразованиях. Потому что представление данных на сервере часто отличается от того, как они представлены на стороне клиента. Ember ожидает, что преобразования не будут изменять передаваемые значения serialized или deserialized, а вместо этого будут возвращать новые значения.

Причина возникновения этой ошибки в том, что Ember имеет конечный автомат для отслеживания состояния записи по отношению к серверу (см. http://emberjs.com/api/data/classes/DS.RootState.html). В этом случае ember, скорее всего, переводит запись в состояние inFlight. Затем он вызывает функцию сериализации преобразования. Когда вызывается item.set, ember замечает изменение в записи и непреднамеренно переводит запись обратно в состояние uncommitted. После того, как сервер отвечает на запрос на сохранение, Ember ошибочно полагает, что запись все еще находится в состоянии inFlight, сигнализирует о событии didCommit, поэтому запись может перейти в состояние saved. Поскольку состояние uncommitted не поддерживает событие didCommit, ember выдает ошибку.

Я подозреваю, что вы могли бы решить эту проблему, переписав свою функцию сериализации, чтобы она не вызывала set, а вместо этого возвращала новый массив.

    serialize : function(deserialized) {
        if (Ember.isArray(deserialized)) {
            return deserialized.map(function(item) {
                if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) {
                    return moment(item.get('value')).format("DD.MM.YYYY");
                }
            });
        }

        return [];
    }
person bmac    schedule 13.02.2014