首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ember js -在更新其他表后有许多关系中断

Ember js -在更新其他表后有许多关系中断
EN

Stack Overflow用户
提问于 2013-10-26 15:40:04
回答 2查看 1.1K关注 0票数 60

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

我有一个带有hasMany关系的帖子和评论模型:

代码语言:javascript
复制
App.Post = DS.Model.extend({
    title: DS.attr('string'),
    comments: DS.hasMany('comment', {
        async: true
    })
});
App.Comment = DS.Model.extend({
    message: DS.attr('string')
});

下面是我的帖子和评论控制器:

代码语言:javascript
复制
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();
        }
    }
});

创建记录时,hasMany关系已正确更新。

代码语言:javascript
复制
{
    "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"
            }
        }
    }
}

编辑帖子时出现问题。编辑帖子记录后,这些关系就消失了。我做了一些搜索,找到了下面的代码:

代码语言:javascript
复制
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引用都会被整个对象替换,如下所示:

代码语言:javascript
复制
{"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"}}}}

评论引用应该是这样的注释“:”"comments":{"message":"comment“,”tgjtj“”,但是id被替换为p31al 1"},{“”:“Comment 2"}

EN

回答 2

Stack Overflow用户

发布于 2015-04-08 01:58:36

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

是不是问了之后就修好了?

票数 1
EN

Stack Overflow用户

发布于 2014-04-19 14:56:00

在我和Ember的旅程中我注意到了几件事。尤其是Ember-Data。

其中之一是在处理关联时,我必须手动重新添加关联保存和重新保存,并使用addObject来存储内存中的关联,因为您在这里使用了一点。:)

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

我有点担心在您的代码库中看到以下代码,因为它不应该出现在那里。您的关联中不应该有null或非数组对象。我不确定你对Adapter做了什么黑客攻击,为什么它是必要的,但我希望这不是原因:

代码语言:javascript
复制
  if(comments.get('content') == null)
    comments.set('content', []);

无论如何,下面的代码可能是我编写create操作的方式。这可能会有帮助。我希望是这样。

代码语言:javascript
复制
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);
  });
}

请注意,这要简单得多。通常情况下,如果你正在做一些棘手的复杂的事情,有些事情是错误的,现在是时候回到基础上,一次添加一件事情,在添加之间彻底测试。:)

祝好运!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19604244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档