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

看看源代码: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 回答
2

您不想在 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 回答