2012-12-10 20 views
6

मैं अपने आवेदन के भीतर EXTJS स्टोर की कॉन्फ़िगरेशन को केंद्रीकृत करने की कोशिश कर रहा हूं, हालांकि, मुझे यह समझने की प्रतीत नहीं होती है कि यह कैसे किया जाए। मैं ExtJS 4.1 का उपयोग कर रहा हूँ।विस्तार Ext.data.Store

मेरे पास एक बेस स्टोर है, जिसे मैं सभी दोहराव वाली कॉन्फ़िगरेशन सामग्री को पकड़ना चाहता हूं, और उसके बाद मेरे अधिक विशिष्ट स्टोर वास्तव में अलग-अलग हैं।

Ext.define('My.store.Abstract', { 
    extend: 'Ext.data.Store', 
    autoload:false, 
    proxy: { 
     type: 'ajax', 
     reader: { 
      type: 'json', 
      root: 'data', 
      totalProperty: 'total', 
      successProperty: 'success', 
      messageProperty: 'message' 
     }, 
     writer: { 
      type: 'json', 
      encode: true, 
      writeAllFields: true, 
      root: 'data', 
      allowSingle: false 
     }, 
     simpleSortMode: true 
    } 
}); 

तो मैं दुकान के आधार द्वारा एक दुकान पर दुकान विशिष्ट सामान प्रदान करना चाहते हैं -

Ext.define('My.store.Products', { 
    extend: 'My.store.Abstract', 
    storeId: 'Products', 
    model: 'My.model.Product', 
    proxy: { 
     api: { 
      create: '/myurl/create', 
      read: '/myurl/index', 
      update: '/myurl/update', 
      destroy: '/myurl/delete' 
     } 
    } 
}); 

क्या मैं लग रहा है कि यह सिर्फ does not सब पर व्यवहार करते है। मेरा मानना ​​है कि इसमें प्रॉक्सी के साथ कुछ करना है, लेकिन मैं इसे ट्रैक नहीं कर सकता।

ऐसा करने का सही तरीका क्या है? मैं अपने आवेदन में 350+ स्टोर्स में एक ही विन्यास सामग्री (मेरे अमूर्त स्टोर से) को दोहराना नहीं चाहूंगा। अभी तक, मेरे पास यह है, और मैंने सोचा कि मैं एक सुंदर बुनियादी अवधारणा को लागू करने की कोशिश कर रहा था .. इसका कोई फायदा नहीं हुआ।

मुझे पता है कि चीजें काम नहीं कर रही हैं, पेज आकार के रूप में बुनियादी, या यहां तक ​​कि ऑटोलोड .. क्योंकि उनका बिल्कुल सम्मान नहीं किया जा रहा है।

मैंने रचनाकारों के साथ खेला है, और माता-पिता को बुलाया है।

किसी भी मदद की सराहना की जाएगी।

उत्तर

10

आप इसे इस तरह से नहीं कर सकते हैं क्योंकि आप उन वस्तुओं को मर्ज करने की उम्मीद कर रहे हैं जो यह नहीं करेंगे।

इसके बजाय, आप कुछ इस तरह को देखने के लिए चाहता हूँ (untested):

बेस स्टोर (ऐप्लिकेशन/स्टोर/Base.js):

Ext.define('Base', { 
    extend: 'Ext.data.Store', 

    autoLoad: false, 

    constructor: function(config) { 
     // applyIf means only copy if it doesn't exist 
     Ext.applyIf(config, { 
      proxy: this.createProxy() 
     }); 
     this.callParent([config]); 
    }, 

    createProxy: function() { 
     return { 
      reader: { 
       type: 'json', 
       root: 'data', 
       totalProperty: 'total', 
       successProperty: 'success', 
       messageProperty: 'message' 
      }, 
      writer: { 
       type: 'json', 
       encode: true, 
       writeAllFields: true, 
       root: 'data', 
       allowSingle: false 
      }, 
      simpleSortMode: true 
     } 
    } 
}); 

Ext.define('Sub', { 
    extend: 'Base', 

    createProxy: function(){ 
     var proxy = this.callParent(); 
     proxy.api = { 
      create: 'create', 
      update: 'update' 
     }; 

     return proxy; 
    } 
}); 
+0

ओवरराइड के लिए मॉड्यूलरिंग नेस्टेड कॉन्फ़िगरेशन का बहुत अच्छा उदाहरण, धन्यवाद इवान! – dbrin

+0

यही वह दृष्टिकोण है जिसके साथ मैं समाप्त हुआ। अंतर्दृष्टि के लिए धन्यवाद। –

+0

@JimEckels, तो उत्तर स्वीकार करें। उत्तर के बाईं ओर चेक साइन पर क्लिक करें। धन्यवाद। – gdoron

1

यहाँ एक और तरीका है

Ext.define('Admin3.store.Base', { 
    extend: 'Ext.data.Store', 
    autoLoad: true, 
    autoSync: true 
}); 

बेस प्रॉक्सी (एप्लिकेशन/प्रॉक्सी/Base.js):

Ext.define('Admin3.proxy.Base', { 
    extend: 'Ext.data.proxy.Ajax', 
    alias: 'proxy.base', 
    reader: { 
     type: 'json', 
     root: 'items', 
     successProperty: 'success', 
     messageProperty: 'message' 
    }, 
    listeners: { 
     exception: function(proxy, response, operation){ 
      console.log(response, operation); 
      Ext.Msg.show({ 
       title: 'Remote Exception', 
       msg: typeof operation.getError() === 'string' ? operation.getError() : operation.getError().statusText, 
       icon: Ext.Msg.ERROR, 
       buttons: Ext.Msg.OK 
      }); 
     } 
    } 
}); 

कंक्रीट स्टोर (ऐप्लिकेशन/स्टोर/Users.js):

Ext.define('Admin3.store.Users', { 
    extend: 'Admin3.store.Base', 
    model: 'Admin3.model.User', 
    proxy: Ext.create('Admin3.proxy.Base', { 
     api: { 
      read: 'data/read.php', 
      update: 'data/update.php' 
     } 
    }) 
}); 
0

मुझे लगता है कि यहां अन्य उत्तर में थोड़ा और अधिक जटिल की तुलना में वे करने की आवश्यकता हो सकती है। संस्करण 4.0.0 के अनुसार, एक्सटीजेएस में Ext.Object.merge() method है जो पूछताछ करने वाले प्रयास के करीब एक दृष्टिकोण की अनुमति देगा।

मूल्यों प्रश्नकर्ता है कि का उपयोग करना, मैं इस तरह मेरे "सार" स्टोर निर्धारित करेंगे:

Ext.define("Ext.ux.data.Store", { 
    extend: "Ext.data.Store", 
    constructor: function(config) { 
     var defaults = { 
      autoload: false, 
      proxy: { 
       type: "ajax", 
       reader: { 
        type: "json", 
        root: "data", 
        totalProperty: "total", 
        successProperty: "success", 
        messageProperty: "message" 
       }, 
       writer: { 
        type: "json", 
        encode: true, 
        writeAllFields: true, 
        root: "data", 
        allowSingle: false 
       }, 
       simpleSortMode: true 
      } 
     }; 
     this.callParent([Ext.Object.merge({}, defaults, config)]); 
    } 
}); 

मैं तो इस तरह मेरी ठोस भंडार बना सकते हैं:

Ext.create("Ext.ux.data.Store", { 
    storeId: "ExampleStore", 
    model: "ExampleModel", 
    autoLoad: true, // This overrides the defaults 
    proxy: { 
     api: { 
      read: "/example/read" // This overrides the defaults 
     } 
    } 
}); 

यह दृष्टिकोण घटकों के कई स्तरों के लिए भी काम करेगा।उदाहरण के लिए, आप केवल पढ़ने के लिए स्टोर कर सकते हैं:

Ext.define("Ext.ux.data.ReadonlyStore", { 
    extend: "Ext.ux.data.Store", 
    constructor: function(config) { 
     var overrides = { 
      proxy: { 
       api: { 
        create: undefined, 
        update: undefined, 
        destroy: undefined 
       } 
      } 
     } 
     this.callParent([Ext.Object.merge({}, config, overrides)]); // Note that the order of parameters changes here 
    } 
}); 
संबंधित मुद्दे