Ember-data проверяет, была ли модель найдена в хранилище при десериализации через маршрутизатор

У меня есть маршрут объекта в маршрутизаторе (с использованием ember-данных со стандартным бэкэндом REST) ​​с connectOutlets, который просто десериализует и загружает объект и подключает его к розетке.

  # inside router 
  action: Ember.Route.extend
    route: 'object/:object_id'

    connectOutlets: (router, object) ->
      unless object.get('isLoaded') # What goes here to tell if the object wasn't found?
         #
         #  handle this case (e.g., redirect)
         #
      else # otherwise proceed as normal
        router.get('applicationController').connectOutlet('object', object) 

Когда я перехожу к localhost/#object/object_that_doesnt_exist, маршрутизатор десериализует URL-адрес, пытается загрузить объект (журналы сервера показывают HTTP-запрос GET для localhost/objects/object_that_doesnt_exist), получает 404 и вместо этого создает новый объект с идентификатором, установленным на object_that_doesnt_exist.

Я хочу обнаружить это и разобраться с делом. Прямо сейчас я проверяю свойство isLoaded, которое различает существующие и несуществующие модели, но я не уверен, что это лучший способ.

В идеале должен быть метод, похожий на new_record? в Rails.


person Sherwin Yu    schedule 08.12.2012    source источник


Ответы (2)


Взгляните на исходный код: https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/model.js#L15

isError: retrieveFromCurrentState,
isNew: retrieveFromCurrentState,
isValid: retrieveFromCurrentState,

Сам не пробовал, но isNew может быть тем, что вы ищете.

person Alexander Zaytsev    schedule 09.12.2012

Вы не хотите делать это в connectOutlet, потому что это потребует от приложения ожидания, пока оно проверяет БД на наличие записи.

Лично я бы использовал собственный метод find в своем адаптере и оттуда обрабатывал ошибку 404.

find: function(store, type, id) {
  var root = this.rootForType(type);

  this.ajax(this.buildURL(root, id), "GET", {
    success: function(json) {
      this.didFindRecord(store, type, json, id);
    },
    statusCode: {
      404: function() {
        # I can never remember the exact semantics, but I think it's something like this
        this.trigger('didNotFindRecord');
      }
    }
  })
}


connectOutlets: (router, object) ->
  router.get('store').addObserver('didNotFindRecord', this, 'handle404')
  router.get('applicationController').connectOutlet('object', object) 

handle404: ->
     # 
     #  handle this case (e.g., redirect)
     #

Однако вам нужно быть осторожным, чтобы правильно уничтожить наблюдателей.

person Bradley Priest    schedule 09.12.2012
comment
Спасибо за ответ - я не думаю, что «ожидание, пока приложение проверит БД на наличие записи», является уместным возражением против того, чтобы делать это в connectOutlets, потому что я использую ember-data и к моменту вызова connectOutlets, приложение уже пыталось получить объект (независимо от того, существует ли он в БД или нет). Я использую ember-data для своего адаптера - я предполагаю, что мне не нужно слишком много возиться с ним из коробки. - person Sherwin Yu; 11.12.2012
comment
Шервин: Я думаю, что асинхронные пользовательские интерфейсы должны быть важной частью любого современного веб-приложения, и ожидание завершения вызова AJAX — невероятно уместное возражение. При этом, если вы просто собираете что-то для развлечения, дерзайте. Что касается работы с ember-data, я считаю, что лучший способ справиться с этим будет добавлен в библиотеку, как только она стабилизируется, так что это просто добавление несуществующих функций. - person Bradley Priest; 11.12.2012