Ember js - 更新其他表后 Hasmany 关系中断

Posted

技术标签:

【中文标题】Ember js - 更新其他表后 Hasmany 关系中断【英文标题】:Ember js - Hasmany relationships breaks after updating other tables 【发布时间】:2013-11-05 10:07:32 【问题描述】:

我正在使用带有本地存储适配器的 Ember.js。我在更新记录时遇到了一个奇怪的问题。

我有一个包含 hasMany 关系的 post 和 cmets 模型:

App.Post = DS.Model.extend(
    title: DS.attr('string'),
    comments: DS.hasMany('comment', 
        async: true
    )
);
App.Comment = DS.Model.extend(
    message: DS.attr('string')
);

这些是我的 post 和 cmets 控制器:

App.PostsController = Ember.ArrayController.extend(
    newTitle: '',
    actions: 
        create: function() 
            var title = this.get('newTitle');
            var post = this.store.createRecord('post', 
                title: title
            );
            this.set('newTitle', '');
            post.save();
        
    
);
App.CommentsController = Ember.ArrayController.extend(
    needs: "post",
    post: Ember.computed.alias("controllers.post.model"),
    newMessage: '',
    actions: 
        create: function() 
            var message = this.get('newMessage');
            var comment = this.store.createRecord('comment', 
                message: message
            );
            var post = this.get('post');
            var comments = post.get('comments');
            if (comments.get('content') == null) comments.set('content', []);
            comments.pushObject(comment);
            comment.save();
            post.save();
        
    
);

在创建记录时,许多关系已正确更新。


    "App.Post": 
        "records": 
            "0v66j": 
                "id": "0v66j",
                "title": "post1",
                "comments": ["p31al", "tgjtj"]
            
        
    ,
    "App.Comment": 
        "records": 
            "p31al": 
                "id": "p31al",
                "message": "comment 1"
            ,
            "tgjtj": 
                "id": "tgjtj",
                "message": "comment 2"
            
        
    

编辑帖子时出现问题。编辑帖子记录后,关系消失了。我做了一些搜索,发现了这段代码:

DS.JSONSerializer.reopen(
    serializeHasMany: function(record, json, relationship) 
        var key = relationship.key;
        var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship);
        //  alert(relationshipType);
        if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === 'manyToOne') 
            json[key] = Ember.get(record, key).mapBy('id');
            // TODO support for polymorphic manyToNone and manyToMany
            // relationships
        
    
);

这成功了,而且效果很好。但现在我有另一个问题。如果我编辑任何其他记录,所有 id 引用都将替换为整个对象,如下所示:

"App.Post":"records":"0v66j":"id":"0v66j","title":"post2","comments":[**"message":"comment 1",
"message":"comment 2"**],"8nihs":"id":"8nihs","title":"post3","comments":["b4v2b","dbki4"],
"App.Comment":"records":"p31al":"id":"p31al","message":"comment 1","tgjtj":"id":"tgjtj","message":"comment 2",
"b4v2b":"id":"b4v2b","message":"comments3","dbki4":"id":"dbki4",
"message":"comments4"

评论引用应该是 cmets":["p31al","tgjtj"] 像这样。但是 id 被替换为 "cmets":["message":"comment 1","message":"comment 2"]

【问题讨论】:

不能只动态更新评论吗?而不是返回整个 json 对象? 【参考方案1】:

当使用扩展 LSSerializer 的 ApplicationSerializer 时,它似乎可以工作。

也许它在被问到之后得到了修复?

【讨论】:

【参考方案2】:

我在使用 Ember 的过程中注意到了一些事情……尤其是 Ember-Data。

其中之一是在处理关联时,我不得不手动重新添加关联保存并且必须重新保存,并使用 addObject 到内存中的关联,就像您在这里使用的那样。 :)

请注意,这通常仅在我一次更新多个新对象时发生。例如,如果您的帖子是新的,而您的评论也是新的。

我有点担心在您的代码库中看到以下代码,因为它不应该存在。您的关联中不应该有 null 或非数组对象。我不确定您对适配器做了什么黑客行为以及为什么需要这样做,但我希望这不是原因:

  if(comments.get('content') == null)
    comments.set('content', []);

无论如何,以下代码是我可能会如何编写您的创建操作的方式。它可能会有所帮助。我希望是的。

create: function() 
  // get the post for association on the new comment
  var post = this.get('post');

  // get the message to store on the new comment
  var message = this.get('newMessage');

  var comment = this.store.createRecord('comment', 
    message : message,
    post : post
  );

  comment.save().then(function(savedComment) 
    post.get('comments').addObject(savedComment);
  );

请注意,它要简单得多。一般来说,如果你在做棘手的复杂事情,就会出现问题,是时候回到基础,一次添加一件事,在添加之间进行彻底的测试。 :)

祝你好运!

【讨论】:

这对您的问题有帮助吗?进展如何?

以上是关于Ember js - 更新其他表后 Hasmany 关系中断的主要内容,如果未能解决你的问题,请参考以下文章

Ember Mirage 模型:对于多个 hasMany 和 belongsTo

Ember 数据:为啥 hasMany 和 belongsTo

如何使嵌入的 hasMany 关系与 ember 数据一起使用

具有嵌套 hasMany 或 belongsTo 关系的 Ember 模型

ember.js 控制器中的排序模型

用于从 hasMany 关系中检索一条记录的 Ember 计算属性?