2011-10-24 8 views
9

मैं ExtJS 4 का उपयोग कर रहा है और एक ajax प्रॉक्सी और एपीआई के साथ एक Ext.data.Store है:store.remove रद्द ExtJS 4 में सर्वर कॉल के बाद

var gridStore = Ext.create('Ext.data.Store', { 
    autoSync: true, 
    proxy: { 
     type: 'ajax', 
     api: { 
      read: 'myurl', 
      create: 'myurl', 
      update: 'myurl', 
      destroy: 'myurl' 
     }, 
     reader: { 
      type: 'json', 
      successProperty: 'success', 
      root: 'data', 
      messageProperty: 'message' 
     }, 
     writer: { 
      type: 'json', 
      writeAllFields: false, 
      root: 'data' 
     }, 
     listeners: { 
      exception: function(proxy, response, operation){ 
       Ext.MessageBox.show({ 
        title: 'Server error', 
        msg: operation.getError(), 
        icon: Ext.MessageBox.ERROR, 
        buttons: Ext.Msg.OK 
       }); 
      } 
     } 
    ... 

जब मैं अद्यतन समारोह और अपने सर्वर का उपयोग success:false के साथ एक जेसन ऑब्जेक्ट देता है (क्योंकि उसने कुछ गलत दर्ज किया है) मेरे संबंधित ग्रिड में फ़ील्ड अभी भी बदल गया है और उपयोगकर्ता के पास अपना गलत मान बदलने का विकल्प है।

यह ठीक काम करता है।

लेकिन जब मैं दुकान से एक रिकॉर्ड को दूर ...

var store = Ext.StoreManager.lookup('gridStore'); 
store.remove(store.getById(id)); 

... तो ExtJS की दुकान से इस रिकॉर्ड के पहले दूर करता है और AJAX API बाद में कहते हैं। तो जब नष्ट एपीआई success:false देता है तो संदेश अपडेट एपीआई जैसे अपवाद के रूप में दिखाया जाता है, ठीक है, लेकिन मेरा रिकॉर्ड स्टोर से हटा दिया गया है! उदाहरण के लिए सर्वर से अपवाद कहता है कि आप इस रिकॉर्ड को हटा नहीं सकते क्योंकि यह स्टोर में पहले से ही हटा दिया गया है।

सर्वर सिंक के बाद स्टोर हटाने को कैसे रद्द करें? यदि सर्वर success:false देता है तो मैं स्टोर में रहने के लिए रिकॉर्ड चाहता हूं।

कोई विचार? शायद एक बग?


अद्यतन समाधान

रयान के anwer आधार पर, मैं निम्नलिखित के रूप में अपवाद श्रोता है, जो बहुत अच्छी तरह से काम करता है संशोधित:

listeners: { 
    exception: function(proxy, response, operation){ 
     Ext.MessageBox.show(...); 
     // get the removed records and insert them where they have been 
     var removedRecords = gridStore.getRemovedRecords(); 
     for(var i=0; i<removedRecords.length; i++){ 
      var record = removedRecords[i]; 
      gridStore.insert(record.index, record); 
     } 
    } 
} 
+0

शायद एक बग, या क्या होता है यह देखने के लिए स्रोत कोड में खोदने की आवश्यकता है। हम्म। दिलचस्प सवाल इससे पहले देखा, लेकिन मैं दुकान को फिर से लोड करके इसे दूर कर लिया। अक्षम लेकिन यह छोटे डेटा के लिए ठीक है। –

+3

अच्छा एक :) लेकिन आप 'gridStore.removed = []' और अन्यथा जोड़ना भूल गए हैं यदि आप उस आइटम को दोबारा हटा दें तो आपके पास डुप्लिकेट होगा (फिर यह अभी भी हटाए गए सरणी में है) – VDP

उत्तर

5

बस, कोड दिया था विस्तार विशेष रूप से listeners क्षेत्र:

listeners: { 
     exception: function(proxy, response, operation){ 
      Ext.MessageBox.show({ 
       title: 'Server error', 
       msg: operation.getError(), 
       icon: Ext.MessageBox.ERROR, 
       buttons: Ext.Msg.OK 
      }); 
      gridStore.add(gridStore.getRemovedRecords()); 
     } 
    } 
+0

बहुत बहुत धन्यवाद, यह सही तरीका है। मैंने आपके समाधान को थोड़ा सा बदल दिया है, मेरे अपडेट किए गए प्रश्नों पर नज़र डालें, क्योंकि यदि आप केवल रिकॉर्ड जोड़ते हैं, तो उन्हें सूची के अंत में जोड़ा जाता है लेकिन उन्हें वहां रहना चाहिए जहां वे पहले थे। – Marc

2

मैं model.destroy उपयोग कर रहा हूँ, इस मैं ग्रिड से विलक्षण प्रविष्टियों को हटाने के लिए करते हैं:

   text : 'Delete', 
       itemId : 'delete', 
       scope : this, 
       handler : function() { 
        var selection = grid.getView().getSelectionModel().getSelection()[0]; 
        if(selection) { 
         selection.destroy({ 
          failure : function() { 
           console.log('Record could not be deleted.'); 
          }, 
          success : function() { 
           store.remove(selection); 
           console.log('Record successfuly removed.'); 
          }, 

         }); 
        } 
       } 
+0

अच्छा। केवल एक रिकॉर्ड के लिए उपयुक्त है। –

6

डालने तकनीक मेरे लिए काम नहीं किया, हटाया रिकॉर्ड अगले समन्वयन कार्रवाई पर हटाने के लिए चिह्नित रहता है। मैं इस उद्देश्य के लिए Ext.data.Store.rejectChanges() का उपयोग कर रहा हूं।

+0

यह कोई डिफ़ॉल्ट तरीका नहीं है? क्या आपने [इस कार्यान्वयन] का उपयोग किया था (http://www.sencha.com/forum/showthread.php?141982-commitChanges-and-rejectChanges-for-the-Store-in-ExtJS-4)? – VDP

+0

यह विधि ExtJS 4.1.1a में मौजूद है। बीच में 4.0 या संस्करण के बारे में निश्चित नहीं है।यह सही जवाब होना चाहिए। –

2

मैं सिंक होने पर कॉलबैक फ़ंक्शंस 'सफलता', 'विफलता' या 'कॉलबैक' का उपयोग कर रहा हूं। मुझे आशा है कि यह विधि आपकी मदद कर सकती है।

store.remove(records); 
store.sync({ 
    success: function (proxy, operations) { 
     // pop success message 
    }, failure: function (proxy, operations) { 
     // resume records 
     store.rejectChanges(); 
    } 
}); 
संबंधित मुद्दे