Saya menggunakan Ember.js dengan lokal-bagasi-adaptor. Saya punya masalah aneh saat memperbarui catatan.
Saya memiliki posting dan komentar model dengan hasMany hubungan:
App.Post = DS.Model.extend({
title: DS.attr('string'),
comments: DS.hasMany('comment', {
async: true
})
});
App.Comment = DS.Model.extend({
message: DS.attr('string')
});
Ini saya posting dan komentar controller:
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();
}
}
});
Saat membuat catatan hasMany hubungan diperbarui dengan benar.
{
"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"
}
}
}
}
Masalah terjadi ketika mengedit posting. Hubungan yang hilang setelah mengedit posting catatan. Aku mencari dan menemukan kode ini:
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
}
}
});
Ini melakukan trik dan bekerja dengan baik. Tapi sekarang aku punya masalah lain. Jika saya mengedit catatan lain, semua id referensi digantikan oleh seluruh objek seperti ini:
{"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"}}}}
Komentar refrences harus komentar":["p31al","tgjtj"] seperti ini. tapi id diganti sebagai "komentar":[{"pesan":"komentar 1"},{"pesan":"komentar 2"}]
I'telah memperhatikan beberapa hal di jalan saya dengan Bara... dan terutama Ember-Data.
Salah satunya adalah ketika berhadapan dengan asosiasi I've harus secara manual menambahkan dalam asosiasi tabungan dan harus kembali menyimpan, dan menggunakan addObject ke dalam memori asosiasi seperti anda're menggunakan sedikit di sini. :)
Perhatikan bahwa hal ini biasanya hanya terjadi ketika saya'm memperbarui lebih dari satu objek baru sekaligus. Misalnya, jika anda membuat posting baru, dan komentar anda juga baru.
I'm sedikit khawatir untuk lihat kode berikut pada basis kode, karena itu seharusnya't harus berada di sana. Seharusnya kau't pernah memiliki nol atau non-array objek dalam asosiasi anda. I'm tidak yakin apa yang hackery anda lakukan dengan Adaptor dan mengapa hal itu perlu, tapi saya berharap bahwa itu't alasannya:
if(comments.get('content') == null)
comments.set('content', []);
Pokoknya, kode berikut adalah cara saya mungkin akan menulis anda membuat tindakan. Ini mungkin bisa membantu. Saya berharap itu tidak.
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);
});
}
Perhatikan bahwa itu's jauh lebih sederhana. Umumnya jika anda're lakukan rumit hal-hal yang rumit, sesuatu yang's salah dan itu's waktu untuk kembali ke dasar-dasar dan menambahkan satu hal pada satu waktu, pengujian secara menyeluruh antara penambahan. :)
Good luck!