2015-09-06 5 views
0

В приложении, использующем стандартный Ember 2.0 DS.JSONAPISerializer, поведение по умолчанию для REST API, отвечающего на save(), - это «возврат пустого объекта ({})». [1]Ручка корпуса JSON После сохранения() на модели

В моем случае мой REST API выполняет некоторые изменения в данных, в том числе присваивает идентификатор BigSerial Int64 ID из Postgres и обрабатывает ввод текста Markdown (намного быстрее, чем Ember). Это должно (должно быть) синхронно/блокировать.

Есть ли идиоматический подход к обработке ответа от save() по умолчанию DS.JSONAPISerializer, чтобы возвращаемая модель JSON была сохранена в кеше Ember?

Из того, что я вижу, я должен быть переопределяющим normaliseSaveResponse, чтобы достичь этого, приняв ответ с сервера. Это не сразу понятно, как я должен установить поля в «просто спас» модель с сервером при условии значений, однако:

// app/models/item.js - simplified 
export default DS.Model.extend({ 
    id: DS.attr("number"), 
    title: DS.attr(), 
    body: DS.attr(), 
    // Only populated in the server response 
    rendered: DS.attr(), 
    createdDate: DS.attr("date"), 

    normalizeSaveResponse: function(store, primaryType, payload, id, requestType) { 
    // What goes here to deserialize the response into the model? 
    this.id = payload.item[i].id, 
    this.title = payload.item[i].title, 
    this.body = payload.item[i].rendered, 
    } 
}); 

Резюмируя:

  • мне нужно заполнить поле ID в модели с порядковым ID с сервера в ответ на save()
  • мне также нужно заполнить rendered поле с Markdown
  • Дата поля, и т.д. с сервера проверяются метки времени
  • Это работает при сохранении одного элемента и нескольких элементов?

Если есть лучший способ достичь этого - например, другой метод - я открыт для предложений. Желание иметь дополнительные проверки/преобразования на сервере, вернуть «исправленный» ответ, а затем заставить Ember сохранить его в своем собственном магазине => переход на /model/:id.

+0

вы пытаетесь просто вернуть модель с сервера ли? Он отлично работает для меня с RESTAdapter в 1.13.9 –

+0

@GennadyDogaev Когда вы говорите «отлично работает», вы имеете в виду «он автоматически заполняет любые пустые поля (id, rendered и т. Д.) С ответом JSON сервера от' model.save() '' -? Если это так, это здорово - просто конфликты с моим пониманием документов. – elithrar

+1

Да, это именно то, что я имею в виду –

ответ

1

Просто, чтобы закрыть это: поведение по умолчанию Ember Data является для заполнения полей (пустые или нет) в модели с ответом JSON, если данные имеют правильную структуру для вашего адаптера (то есть RESTAdapter)

например

модель как ниже, используя RESTAdapter:

export default DS.Model.extend({ 
    id: DS.attr("number"), 
    title: DS.attr(), 
    body: DS.attr(), 
    // Only populated in the server response 
    rendered: DS.attr(), 
    // Only populated in the server response 
    createdDate: DS.attr("date"), 
}); 

... будет иметь rendered и createdDate поля заселенные сервера при условии, ваш ответ выглядит ниже, с одним исключением (отметить):

{ 
    // This can be pluralized regardless of a single item or array response as Ember can deserialize it regardless 
    "posts": [{ 
    "id": 1, 
    "title": "I'm Running to Reform the W3C's Tag", 
    "body": "Yehuda Katz", 
    "rendered": "<some markdown>", 
    // snake_case - not suitable by default 
    "created_at": "2015-09-08T20:31:09Z" 
    }] 
} 

Вы можете исправить это путем переопределения метода keyForAttribute на вашем сериализатором:

// app/serializers/application.js 
export default DS.RESTSerializer.extend({ 
    keyForAttribute: function(key) { 
    return Ember.String.decamelize(key); 
    } 
}); 

Ref: http://emberigniter.com/fit-any-backend-into-ember-custom-adapters-serializers/

Смежные вопросы