【问题标题】:How to deserialize self many-to-many for ember data如何为ember数据反序列化自我多对多
【发布时间】:2014-02-19 03:24:11
【问题描述】:
//Setup:
Ember: 1.3.2
Handlebars: 1.3.0
jQuery: 2.0.0
-----------------
MongoDB (_id's, embedded data)

我一直在尝试建立这样的多对多关系:

//Model:
App.Post = DS.Model.extend({
    title: DS.attr('string'),
    content: DS.attr('string'),
    links: DS.hasMany('App.Post'), 
});

出于(希望)显而易见的原因,应将链接作为 id 嵌入。

经过几天的挖掘,我设法让应用通过 RESTAdapter 正确序列化并提交数据,我使用的代码如下所示:

//Controller:
App.PostController = Ember.ObjectController.extend({
    actions: {
        addRelated: function(related) {
            var links = this.content.get('links').pushObject(related);
            this.content.save();
        }
    }
});

//Store:
App.Store = DS.Store.extend({
    revision: 12,
    adapter: DS.RESTAdapter.extend({
        url: '/admin/api',
        serializer: DS.RESTSerializer.extend({
            primaryKey: function(type) {
                return '_id';
            },
            addHasMany: function(hash, record, key, relationship) {
                if (/_ids$/.test(key)) {
                    hash[key] = [];
                    record.get(this.pluralize(key.replace(/_ids$/, ''))).forEach(function(post) {
                        hash[key].push(post.get('id'));
                    });
                }
                return hash;
            }
        })
    });
});

从我可以收集的数据来看,序列化程序需要表单中的数据

{post: {...}, links: [{...},{...}]}

但由于链接是 post 类型,如果可能的话,我宁愿不创建整个 App.Links 模型。

那么我可以将链接映射到帖子吗?如

{post: {...}, posts: [{...},{...}]}

我尝试添加一个 deserializeHasMany,但在使用 App.Post.find() 时没有被调用

我猜我需要编写一个自定义提取函数来获取 link_ids 并从中提取帖子到记录中?

【问题讨论】:

    标签: javascript rest ember.js ember-data


    【解决方案1】:

    p我没有对此进行测试,但会说:

    您应该将模型更改为如下所示:

    App.Post = DS.Model.extend({
        title: DS.attr('string'),
        content: DS.attr('string'),
        links: DS.hasMany('post'), //changed 
    });
    

    您的 JSON 格式应为:

    {"posts": [{ "id":3 ... post item .... "links":[3,10]} { "id":4... post item .... "links":[4,11]}]} 
    

    所有链接都必须包含在 JSON 中,除非已经加载。

    我的理解是,您不应该重写 RESTAdapter 和 RESTSerializer,因为这应该可以开箱即用 - 如果不是,我会先检查 ajax 和大小写。

    【讨论】:

    • 嗨,Trev,好的,所以我将 json 更改为使用 Posts(我没有将 _id 更改为 id,因为我使用的是 mongodb)。现在的错误是DS.hasMany('post') 创建了以下错误:断言失败:您在 App.Post 上指定了一个 hasMany(帖子),但未找到帖子。 & 断言失败:尝试在 App.Post 上加载链接,但该类型不存在。我还应该注意我不能使用嵌入式帖子,因为这似乎会导致无限递归错误,更不用说我只想存储 id 了
    • 嗨,Joe,ember 对 JSON 的格式非常讲究,如果不是 100%,它将无法正常工作。我没有用过所以不能评论 mongodb 但是我感觉它 ember 期望“id”。链接还必须包含数组中的所有 id,如图所示。在 ember 数据中有一个名为 extractSingle 的函数,如果您在加载时单步执行它,您可以看到 primaryTypeName 和 type.typeKey 之间的关系,如果一切正常,它们应该匹配。如果您不想让 ember 在加载期间检查链接是否存在,您可以设置异步标志,例如: links: DS.hasMany('post', {async: true})
    • 嘿特雷夫,谢谢。我现在不在家,所以稍后我将不得不看一下 extractSingle。我使用dbushell.com/2013/04/25/ember-data-and-mongodb 作为使用 mongodb 的参考,因此设置了主键和 addExtractMany 函数。我认为鉴于链接实际上链接到已经加载的 id(App.Post 依赖于它们),异步应该没关系吗?目前它似乎可以很好地提交链接,并且后端在加载时返回的 json 看起来像 "links":["530407c6b1af9f4f1e8b4567"],(请参阅链接了解如何处理 _id)。
    • 实际上在某个时候它也提交了"link_ids":["530407c6b1af9f4f1e8b4567","530407c6b1af9f4f1e8b4569"],因为 *_ids 似乎是 ember 数据如何处理非嵌入式帖子,但我不确定接下来应该使用这两个中的哪一个。最初的问题是 ember 数据似乎只想通过孩子而不是父母 POST link_ids,请参阅stackoverflow.com/questions/15138219/…上的第一个答案
    • Joe 我感受到了你的痛苦——我花了太多时间才让这个为我工作——也因为 ember 数据发生了很大变化,所以 doco 经常过时并且现在显示错误的做事方式。例如我最初也将我的关系定义为“App.Post”,这现在是错误的,但在逐步完成 extractSingle 之后发现事情不匹配。
    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2013-05-01
    • 2021-05-03
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多