1

ルーターにオブジェクト ルートがあり (標準の REST バックエンドで ember-data を使用) 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 をデシリアライズし、オブジェクトのロードを試み (サーバー ログは localhost/objects/object_that_doesnt_exist に対する HTTP GET 要求を示します)、404 を取得し、代わりに id が に設定された新しいオブジェクトを作成しますobject_that_doesnt_exist

これを検出してケースを処理したい。現在、isLoaded既存のモデルと存在しないモデルを区別するプロパティを確認していますが、これが最善の方法かどうかはわかりません。

理想的には、Rails のnew_record?.

4

2 に答える 2

2

DB でレコードをチェックする間、アプリケーションが待機する必要があるため、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)
     #

ただし、オブザーバーを正しく破棄するように注意する必要があります。

于 2012-12-09T09:03:58.970 に答える
2

ソースコードをご覧ください: https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/model.js#L15

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

自分で試したことはisNewありませんが、あなたが探しているものかもしれません。

于 2012-12-09T01:46:57.953 に答える