मुझे यह मिला, batch
की विधि है जहां Ext.data.Operation
ऑब्जेक्ट सर्वर को भेजने के लिए बनाया गया है।
मैंने Ext.data.proxy.Ajax
को एक नई batch
विधि के साथ बढ़ाया जहां मैं अपने स्वयं के ऑपरेशन क्लास के लिए new Ext.data.Operation
स्विच करता हूं।
संपादित
केवल क्योंकि आप DmitryB पूछा। मुझे अपनी खुद की प्रतिबद्धता को लागू करने के बारे में छोटी सी कहानी रिकॉर्ड विधि यह है कि मुझे वास्तविक डेटाबेस रिकॉर्ड आईडी फ़ील्ड से मेल खाने के लिए अपने डेटा मॉडल "internalId" फ़ील्ड की आवश्यकता होती है। मैं क्यों वास्तव में, यह भी जटिल मुझे व्यक्त करने के लिए है पर नहीं जाऊंगा, लेकिन यहाँ मैं क्या किया है:
मैं इसे कैसे समझते हैं, commitRecords
विधि जब store.sync()
बुला पिछले क्रियाओं में से एक के रूप में निकाल दिया जाता है तो वह अपने आप को बदल देता है नए सर्वर साइड रिकॉर्ड के साथ क्लाइंट साइड पर गंदे रिकॉर्ड जब तक आप अपने सर्वर साइड कंट्रोलर को अजाक्स प्रतिक्रिया में नया सर्वर रिकॉर्ड वापस करने के लिए लिखते हैं, यह तब भी होता है जब सिंक अनुरोध एक सम्मिलित या अद्यतन करता है।
commitRecords
का आधिकारिक कार्यान्वयन डेटा मॉडल के "आंतरिक आईडी" फ़ील्ड का उपयोग करके गंदे क्लाइंट रिकॉर्ड में इस लौटाए गए सर्वर रिकॉर्ड से मेल करने का प्रयास करता है।
जाहिर है, मुझे नहीं पता कि अगली वृद्धिशील डेटाबेस आईडी नए रिकॉर्ड के लिए क्या होने जा रही है, इसलिए मैं इसे डेटाबेस के साथ रिकॉर्ड सिंक से पहले आईडी के रूप में क्लाइंट पक्ष पर असाइन नहीं कर सकता, इसलिए सर्वर रिकॉर्ड कभी नहीं होगा मैच गंदे क्लाइंट रिकॉर्ड के आंतरिक आईडी के खिलाफ मिलान करने में सक्षम हो सकता है जब प्रतिबद्धता को कॉल किया जाता है, यानी क्लाइंट रिकॉर्ड को सही डेटाबेस आईडी नहीं मिलेगी, जिसकी मुझे आवश्यकता है।
तो, क्योंकि इस एप्लिकेशन के लिए मेरी लिखने योग्य डेटा के सभी मॉडल एक "create_time" क्षेत्र है मैं commitRecords विधि के बजाय "internalId" "create_time" क्षेत्र का उपयोग ग्राहक रिकॉर्ड के साथ सर्वर रिकॉर्ड से मिलान करने का फैसला किया ।
यहां विस्तारित Ext.data है।ऑपरेशन वर्ग है, जहां मैं ऐसा किया:
Ext.define('MyApp.ux.QueryOperation', {
extend: 'Ext.data.Operation',
/**
* Use the date_created timestamp if we cant match to an ID.
* This allows client records that did not previously exist on the server
* to be updated with the correct server ID and data
* NB: All implementing data models require a "date_created" field.
*/
commitRecords: function (serverRecords) {
var me = this,
mc, index, clientRecords, serverRec, clientRec;
if (!me.actionSkipSyncRe.test(me.action)) {
clientRecords = me.records;
if (clientRecords && clientRecords.length) {
if (clientRecords.length > 1) {
mc = new Ext.util.MixedCollection();
mc.addAll(serverRecords);
Ext.each(clientRecords, function(clientRec) {
serverRec = mc.findBy(function(record) {
var clientId = clientRec.getId(),
clientTime = clientRec.get('date_created').getTime(),
serverTime = record.get('date_created').getTime();
if(clientId && record.getId() === clientId) {
return true;
}
// timestamp can be within 2ms of record
// (it seems to change slightly in serialization)
return (clientTime > serverTime - 2 && clientTime < serverTime + 2);
});
me.updateClientRecord(clientRec, serverRec);
});
} else {
clientRec = clientRecords[0];
serverRec = serverRecords[0];
me.updateClientRecord(clientRec, serverRec);
}
if (me.actionCommitRecordsRe.test(me.action)) {
for (index = clientRecords.length; index--;) {
clientRecords[index].commit();
}
}
}
}
},
});
मैं जवाब में उल्लेख किया है, मैंने पाया कि मैं अपने नए ऑपरेशन वर्ग का उपयोग करने के लिए प्रॉक्सी का विस्तार करने के लिए किया था। एकमात्र चीज जो मैंने विस्तारित की थी वह batch
विधि थी, जिसने new Ext.data.Operation
कहा था कि विधि में केवल दो पंक्तियों को प्रतिस्थापित किया गया है, अब new MyApp.ux.QueryOperation
(ऊपर मेरा नया ऑपरेशन क्लास) कहें। इसके बाद सर्वर से प्रतिक्रिया वापस आने पर मेरी खुद की प्रतिबद्धता रिकॉर्ड विधि कहा जाता है। मैं भी विस्तारित प्रॉक्सी एक उपनाम "proxy.query" इतना है कि मैं इस तरह इसका इस्तेमाल करने के लिए अपने भंडार बता सकते दिया:
Ext.define('MyApp.store.MyStore', {
extend: 'Ext.data.Store',
requires: [
'ST.ux.QueryProxy',
],
title: 'Student',
model: 'MyApp.model.MyModel',
proxy: {
type: 'query',
// ... ^^^^^ uses my QueryProxy now
// other configs...
}
});
(यदि ऐसा लगता है जैसे मैं इस गलत रास्ते के बारे में जा रहा हूँ या में कुछ छूट गया दस्तावेज़, कृपया मुझे बताएं। मैं इस कार्यक्षमता को प्राप्त करने के एक अंतर्निहित तरीके से खुश रहूंगा।)
अच्छा खोज। शर्मिंदा मत बनो और कुछ कोड साझा करें :) कौन जानता है, शायद एक दिन यह उपयोगी होगा। – dbrin
@DmitryB ठीक है, मैंने खुद को समझाया – Geronimo
मुझे लगता है कि आपका उपयोग केस कितने चेहरे के समान है। मेरे अनुभव में यदि आपके मॉडल पर आपकी आईडी विशेषता 'int' प्रकार है तो डिफ़ॉल्ट प्रॉक्सी सिंक() चलते समय सही चीज करता है। मेरे पास मेरी आईडी प्रॉपर्टी एक स्ट्रिंग होती थी और जिसके कारण आपने सिंक को विफल ऑपरेशन विफल कर दिया था जैसा आपने वर्णन किया था। अनिवार्य रूप से मेरे ग्रिड रिकॉर्ड हमेशा 'गंदे' झंडे दिखाएंगे, भले ही उन्हें सर्वर से सिंक किया गया हो। – dbrin