2013-10-26 12 views
62

Ember.jsをローカルストレージアダプターで使用しています。私はレコードを更新する際に奇妙な問題があります。Ember js - 他のテーブルを更新した後にHasmanyの関係が壊れる

私は、hasManyの関係とポストとコメントモデルを持っている:

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

これらは私のポストとコメントコントローラです:

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の関係が正しく更新されたレコードを作成中。

{ 
    "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の参照は、このように全体のオブジェクトで置き換えられます:「:[」p31al」、 『tgjtj』このようなが、IDS。

{"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"}}}} 

コメントrefrencesはコメントする必要があります[{"メッセージ": "コメント1"}、{"メッセージ": "コメント2"}]

+0

あなたは動的にコメントを更新するだけですか? jsonオブジェクト全体を返す代わりに? – yardpenalty

答えて

-1

私はEmberと私のパスでいくつか気付きました。 。特にEmber-Data。

これらのうちの1つは、関連付けを処理するときに、関連付けを手動で再追加する必要があります。再保存する必要はありません。ここで少し使い慣れているように、addObjectをメモリ内の関連付けに使用してください。 :)

これは通常、一度に複数の新しいオブジェクトを更新する場合にのみ発生します。たとえば、あなたの投稿が新しい場合、あなたのコメントも新しいです。

コードベースに次のコードが表示されることを少し心配しています。コードベースにある必要はないからです。アソシエーション内にヌルオブジェクトまたは配列以外のオブジェクトを配置しないでください。私はあなたがアダプタでやった牛車のかわからないんだけど、なぜそれが必要だったが、私はそれが理由ではありませんでした願っています:

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

とにかく、次のコードは、私はおそらくあなたのcreateアクションを記述します方法です。それは助けるかもしれない。私はそれが願っています。

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つ追加しましょう。 :)

幸運!

+2

これは問題の解決に役立ちましたか?調子はどうですか? –

1

LSSerializerを拡張したApplicationSerializerを使用すると動作するようです。

尋ねられて以来固定されているのでしょうか?

関連する問題