मुझे उत्सुकता है कि Model.save()
प्रतिक्रिया के परिणाम सेट में निहित रिकॉर्ड सर्वर से जुड़े अद्यतन डेटा के बावजूद अपडेट किए गए संबंधित डेटा को ठीक से वापस नहीं करता है प्रतिक्रिया ...ExtJS 4.1 - Model.Save में रिटर्निंग एसोसिएटेड डेटा() प्रतिक्रिया
उदाहरण मॉडल & स्टोर परिभाषा: उसके संबंधित डेटा एक मॉडल के साथ प्रॉक्सी के READ
अनुरोध है, और करने के लिए
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
});
आवेदन सर्वर प्रतिक्रिया। यह सब काम कर रहे हैं डरावनी डोरी!
सर्वर प्रतिक्रिया अनुरोध पढ़ें करने के लिए
{
"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
}
प्रकार अब तक, सब कुछ योजना के अनुसार काम कर रहा है ...
store = Ext.create("App.store.test.Simpson");
homer = store.getById(1);
kids = homer.getKids().getRange();
console.log("The Simpson Kids", kids); // [>constructor, >constructor, >constructor]
अवांछित व्यवहार बचाने से शुरू होकर अद्यतन अनुरोध
यहाँ अद्यतन अनुरोध के लिए अपने परीक्षण प्रतिक्रिया
/** 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!!
}
})
मैं नोटिस कि अगर मैं रिकॉर्ड सर्वर, उत्पन्न एसोसिएशन स्टोर द्वारा लौटाए गए निरीक्षण (यानी, getKidsStore
) निहित रिकॉर्ड मूल हो रहा है ... रिकॉर्ड, यानी, उनके नाम पर "सहेजा" नहीं है। kids
लौटा रिकॉर्ड की संपत्ति, हालांकि, वास्तव में सही डेटा होता है।
यदि मैं सही ढंग से समस्या को समझता हूं, तो यह है कि Ext.data.reader.Reader
.save()
प्रतिक्रिया में निहित संबंधित डेटा के साथ संबंधित स्टोर को सही ढंग से अपडेट नहीं करता है। यदि हां, तो मेरी राय में, यह बहुत ही अनजान है क्योंकि मैं पाठक के समान व्यवहार की अपेक्षा करता हूं जो store.load()
अनुरोध को संभालता है और जेनरेट किए गए एसोसिएशन स्टोर्स को शुरू करने के लिए पॉप्युलेट करता है।
क्या कोई मुझे उस व्यवहार को प्राप्त करने में सही दिशा में इंगित कर सकता है जिसके बाद मैं हूं?
अस्वीकरण: वही प्रश्न यहां पूछा गया था: ExtJs 4 - Load nested data on record save लेकिन बिना किसी प्रतिक्रिया के। मैं अपने सवाल में थोड़ा और अधिक गहन रूप से लग रहा है ..
संपादित करें: http://www.sencha.com/forum/showthread.php?270336-Associated-Data-in-Model.save()-Response
संपादित करें (8/23/13): मैं फिर से मैं Sencha मंचों पर पर इस प्रश्न पोस्ट किया है पूर्ण उदाहरण के साथ इस पोस्ट के साथ-साथ अतिरिक्त निष्कर्ष ...
अच्छा समाधान! किसी कारण से, मैंने पाया है कि मैन्युअल रूप से मॉडल से प्रॉक्सी के पढ़ने के ऑपरेशन को मैन्युअल रूप से आमंत्रित करते समय स्टोर हमेशा अद्यतन नहीं होता है ... इसलिए मैंने मॉडल क्लास पर एक विधि 'अपडेट टू' जोड़ा, जो प्रदान किए गए उदाहरण को अपडेट करने में संभालता है एसोसिएशन स्टोर्स सहित रिकॉर्ड (सर्वर की प्रतिक्रिया से पुनर्प्राप्त)। वही विचार, बस अलग दृष्टिकोण :) –
अधिक स्पष्ट/सहायक होने के लिए मेरे उत्तर में 'updateTo' विधि जोड़ा गया। –