Tôi tò mò là lý do tại sao bản ghi chứa trong tập kết quả của phản hồi Model.save()
không trả lại dữ liệu được liên kết cập nhật đúng cách, mặc dù dữ liệu cập nhật được chứa trong máy chủ phản ứng ...ExtJS 4.1 - Trả về dữ liệu được liên kết trong Model.Save() Response
Ví dụ mẫu & cửa hàng Định nghĩa:
Ext.define("App.model.test.Parent",{
extend: 'Ext.data.Model',
requires: ['App.model.test.Child'],
fields: [
{name: 'id', type: 'int' },
{name: 'name', type: 'string'},
{name: 'kids', type: 'auto', defaultValue: []}
],
idProperty: 'id',
hasMany: [{
foreignKey: 'parent_id',
model: 'App.model.test.Child',
associationKey: 'kids',
name: 'getKids'
}],
proxy: {
type: 'ajax',
api : {
create: '/service/test/create/format/json',
read : '/service/test/read/format/json',
update : '/service/test/update/format/json'
},
reader: {
idProperty : 'id',
type : 'json',
root : 'data',
successProperty : 'success',
messageProperty : 'message'
},
writer: {
type : 'json',
writeAllFields : true
}
}
});
Ext.define("App.model.test.Child",{
extend: 'Ext.data.Model',
fields: [
{name: 'id', type: 'int' },
{name: 'name', type: 'string'},
{name: 'parent_id', type: 'int'}
]
});
Ext.define("App.store.test.Simpson",{
storeId: 'TheSimpsons',
extend: 'Ext.data.Store',
model : 'App.model.test.Parent',
autoLoad: true,
autoSync: false
});
ứng dụng máy chủ đáp ứng với yêu cầu READ
của proxy với một mô hình duy nhất, và các dữ liệu liên quan của nó. Đây là tất cả làm việc hunky dory!
Server Response để ĐỌC Yêu cầu
{
"data":{
"id":1,
"name":"Homer Simpson",
"children":{
"1":{
"id":1,
"name":"Bart Simpson"
},
"2":{
"id":2,
"name":"Lisa Simpson"
},
"3":{
"id":3,
"name":"Maggie Simpson"
}
}
},
"success":true,
"message":null
}
Như vậy đến nay, tất cả mọi thứ đang làm việc theo kế hoạch ...
store = Ext.create("App.store.test.Simpson");
homer = store.getById(1);
kids = homer.getKids().getRange();
console.log("The Simpson Kids", kids); // [>constructor, >constructor, >constructor]
CÁC HÀNH VI không mong muốn bắt đầu với lưu và cập nhật REQUESTS
Đây là phản ứng thử nghiệm của tôi cho CẬP NHẬT Yêu cầu ...
/** Server UPDATE Response */
{
"data":{
"id":1,
"name":"SAVED Homer Simpson",
"kids":[{
"id":1,
"name":"SAVED Bart Simpson",
"parent_id":1
},{
"id":2,
"name":"SAVED Lisa Simpson",
"parent_id":1
},{
"id":3,
"name":"SAVED Maggie Simpson",
"parent_id":1
}]
},
"success":true,
"message":null
}
/** Will call proxy UPDATE, response is above */
homer.save({
success: function(rec, op){
var savedRec = op.getRecords().pop(),
kidNames = '';
console.log(savedRec.get('name')); // SAVED Homer Simpson = CORRECT!
Ext.each(savedRec.getKids().getRange(), function(kid){
kidNames += kid.get('name') + ", ";
});
console.log(kids);
//Outputs: Bart Simpson, Lisa Simpson, Maggie Simpson = WRONG!!
}
})
Tôi nhận thấy rằng nếu tôi kiểm tra các hồ sơ được trả về bởi máy chủ, Hiệp hội Lưu trữ được tạo ra (ví dụ, getKidsStore
) các hồ sơ chứa là bản gốc hồ sơ, tức là, họ không có "SAVED" trong tên của họ. Thuộc tính kids
của bản ghi đã trả về, tuy nhiên, DOES thực sự chứa dữ liệu chính xác.
Nếu tôi hiểu vấn đề chính xác, đó là Ext.data.reader.Reader
không cập nhật chính xác cửa hàng được liên kết với dữ liệu được liên kết có trong phản hồi .save()
. Nếu vậy, theo ý kiến của tôi, điều này là rất unintuitive như tôi mong đợi các hành vi tương tự như người đọc xử lý các yêu cầu store.load()
và populates các cửa hàng hiệp hội được tạo ra để bắt đầu.
Có ai có thể chỉ cho tôi đúng hướng để đạt được hành vi mà tôi theo dõi không?
Tuyên bố từ chối trách nhiệm: Câu hỏi tương tự được hỏi tại đây: ExtJs 4 - Load nested data on record save nhưng không có phản hồi. Tôi cảm thấy câu hỏi của tôi phải được triệt để hơn một chút ..
EDIT: Tôi đã đăng câu hỏi này qua trên các diễn đàn Sencha: http://www.sencha.com/forum/showthread.php?270336-Associated-Data-in-Model.save()-Response
EDIT (8/23/13): tôi tái viết bài này với một ví dụ COMPLETE, cũng như phát hiện thêm ...
Giải pháp tốt! Vì lý do nào đó, tôi thấy rằng Store không phải lúc nào cũng cập nhật khi tự gọi thủ tục đọc của Proxy từ Model ... Vì vậy, tôi đã thêm phương thức 'updateTo' vào lớp Model, nó xử lý việc cập nhật một cá thể thành bản ghi (lấy từ phản hồi của máy chủ), bao gồm các cửa hàng liên kết. Cùng một ý tưởng, cách tiếp cận khác nhau :) –
Đã thêm phương thức 'updateTo' vào câu trả lời của tôi để rõ ràng hơn/hữu ích hơn. –