ember.js - 在normalizePayload中标准化ember-data有效负载,但 "type"为空

标签 ember.js ember-data

我正在尝试编写代码来一般规范嵌入记录。我试图在序列化器的“normalizePayload”方法中执行此操作,因为“extractObject”和“extractArray”不会在 store.pushPayload 调用中被调用(我正在使用 PushPayload 预加载数据)。

这是我的代码:

App.ApplicationSerializer = DS.ActiveModelSerializer.reopen
    embeddedRelationships: []

    extractHasOne: (payload, relationship_name) ->
        object = payload[relationship_name]
        objectId = object['id']
        payload["#{relationship_name}_id"] = objectId
        delete payload[relationship_name]

        return object

    extractHasMany: (payload, relationship_name) ->
        objects = payload[relationship_name]
        objectIds = objects.mapProperty('id')
        payload["#{Ember.Inflector.inflector.singularize(relationship_name)}_ids"] = objectIds
        delete payload[relationship_name]

        return objects

    extractRelationships: (payload) ->
        extracted_objects = {}

        this.embeddedRelationships.forEach((relationship_name) ->
            relationship_payload = payload[relationship_name]
            if relationship_payload instanceof Object
                # has one
                extracted_objects[relationship_name] = this.extractHasOne(relationship_payload, relationship_name)
            else if relationship_payload instanceof Array
                # has many
                extracted_objects[relationship_name] = this.extractHasMany(relationship_payload, relationship_name)
        , this)

        return extracted_objects

    normalizePayload: (type, payload) ->
        if payload[type]?
            # single object
            this.extractRelationships(payload[type])
        else if payload[Ember.Inflector.inflector.pluralize(type)]?
            # many objects
            payload[Ember.Inflector.inflector.pluralize(type)].forEach((object_payload) ->
                this.extractRelationships(object_payload)
            , this)

注意:这还没有完成,因为我还没有合并所有提取的对象并侧载它们。

无论哪种情况,想法都是在子类中,我使用表示必须为该模型标准化的关系的字符串列表来覆盖“嵌入关系”。

我遇到的问题很简单:使用空“type”值调用“normalizePayload”。

我像这样预加载数据:

this.store.pushPayload('category', window.preloadCategories)

这是一个 ember bug,还是我遗漏了什么?

最佳答案

pushPayload 接受类型并获取该 serializer 然后它在不接受类型的自定义序列化器上调用 pushPayload ,所以没有类型被传递到 normalizePayload 中。

我建议为 Category 而不是 Application 创建自定义序列化程序,然后您就会知道它的类别类型。

这背后的原因是pushPayload旨在推送多个类型(即有效负载不仅仅是CategoryPost

商店上的pushPayload

  /**
    Push some raw data into the store.

    The data will be automatically deserialized using the
    serializer for the `type` param.

    This method can be used both to push in brand new
    records, as well as to update existing records.

    You can push in more than one type of object at once.
    All objects should be in the format expected by the
    serializer.

    ```js
    App.ApplicationSerializer = DS.ActiveModelSerializer;

    var pushData = {
      posts: [
        {id: 1, post_title: "Great post", comment_ids: [2]}
      ],
      comments: [
        {id: 2, comment_body: "Insightful comment"}
      ]
    }

    store.pushPayload('post', pushData);
    ```

    @method pushPayload
    @param {String} type
    @param {Object} payload
  */

  pushPayload: function (type, payload) {
    var serializer;
    if (!payload) {
      payload = type;
      serializer = defaultSerializer(this.container);
      Ember.assert("You cannot use `store#pushPayload` without a type unless your default serializer defines `pushPayload`", serializer.pushPayload);
    } else {
      serializer = this.serializerFor(type);
    }
    serializer.pushPayload(this, payload);
  },

序列化器上的pushPayload

    It will first normalize the payload, so you can use this to push
    in data streaming in from your server structured the same way
    that fetches and saves are structured.

    @method pushPayload
    @param {DS.Store} store
    @param {Object} payload
  */
  pushPayload: function(store, payload) {
    payload = this.normalizePayload(null, payload);

    for (var prop in payload) {
      var typeName = this.typeForRoot(prop),
          type = store.modelFor(typeName);

      /*jshint loopfunc:true*/
      var normalizedArray = map.call(payload[prop], function(hash) {
        return this.normalize(type, hash, prop);
      }, this);

      store.pushMany(typeName, normalizedArray);
    }
  },

关于ember.js - 在normalizePayload中标准化ember-data有效负载,但 "type"为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20936004/

相关文章:

javascript - "Ember Simple Auth"来自组件的无效 session

Ember.js:加载相关的多个模型

javascript - Ember 包中各种 JS 文件的用途

javascript - 在 Ember 中,对静态选择值使用子模型是个好主意吗?

javascript - 在 Ember.js 中加载关联模型

javascript - 断言失败: `AdapterError` expects json-api formatted errors array

javascript - 在 coffeescript 中调用函数定义的方法

javascript - Ember RESTAdapter 不联系服务器

javascript - Ember 数据中是否有一个钩子(Hook)我可以用来知道它何时实际向服务器发送请求?

javascript - 我如何构建这个应用程序以避免向服务器发出冗余请求?