javascript एक नियंत्रक में स्टोर घटनाओं के लिए श्रोता सेट करें




model-view-controller extjs (6)

मैंने इसे अपने आप हल किया।

मैंने अपने पैनल के render में मैन्युअल रूप से श्रोता जोड़ा

Ext.getCmp('userPanel').down('gridpanel').getStore().addListener('write',this.finishedLoading, this);

@Nscrob मदद के लिए धन्यवाद।

मेरे पास एक स्टोर, एक मॉडल, और कुछ विचारों के साथ एक नियंत्रक है।

मुझे beforesync लिए सुनने और नियंत्रक में स्टोर की घटना write की ज़रूरत है, लेकिन मुझे नहीं पता कि इन श्रोताओं को नियंत्रकों के control में कैसे सेट किया जाए-समारोह।

मेरा स्टोर इस तरह दिखता है:

Ext.define('DT.store.UsersStore', {
    extend : 'Ext.data.Store',
    model : 'DT.model.User',
    id : 'myStore'
    autoSync : true,
    proxy : {
        type : 'ajax',
        api : {
            read : '/load_entries',
            update : '/update_entry'
        },
        reader : {
            type : 'json',
            root : 'user',
            successProperty : 'success'
        }
    }
});

अब मैं अपने नियंत्रक की घटनाओं को सुनने की कोशिश करता हूं:

...
init : function () {
    this.control({
        'myStore' : {
            beforesync : this.doSomething,
            write : this.doSomethingElse
        }
    });
},
...

मेरा अपेक्षित परिणाम यह है कि घटनाओं को निकाल दिए जाने पर कार्यों को निष्पादित किया जाएगा। लेकिन इस समय जब उन्हें निकाल दिया जाता है तब कुछ भी नहीं होता है।

में इससे कैसे चला सकता हूँ?


दुकान की घटनाओं को रिले क्यों न करें? उदाहरण के लिए:

this.getUsersGrid().relayEvents(this.getUsersStoreStore(), ['write'], 'store')

और फिर करने में सक्षम हो

this.control('somegrid-selector': {storeWrite: function(){...}})


आपका रास्ता संभव है लेकिन यह आदर्श नहीं है, आईएमओ। कंट्रोलर्स के स्टोर गेटटर का उपयोग करना बेहतर तरीका है। आपके मामले में कोड कुछ ऐसा होगा:

init : function () {
    // every controller has getters for its stores.
    // For store UsersStore getter would be getUsersStoreStore()
    this.getUsersStoreStore().addListener('write',this.finishedLoading, this);
    this.control({
        // widgets event handlers
    });
},

Extjs 4.2.1 के लिए, स्टोर श्रोता तक पहुंचने का आपका प्रारंभिक तरीका वास्तव में काम करेगा, अगर आप आईडी के बजाय 'storeId' और 'नियंत्रण' के बजाय 'श्रवण' फ़ंक्शन का उपयोग कर रहे थे:

Ext.define('DT.store.UsersStore', {
    extend : 'Ext.data.Store',
    model : 'DT.model.User',
    storeId : 'myStore'
    ....

init : function () {
    this.listen({
        store: {
           '#myStore' : {
               beforesync : this.doSomething,
               ...

Ext.define('Store', {
    model: 'Model',
    extend: 'Ext.data.Store',
    listeners: {
        'beforesync': function(){
            App.getController('somecontroller').onBeforeSync();
        }
    }
});

ऐप - आपके एप्लिकेशन ऑब्जेक्ट पर फ़ंक्शन से पहले आप इसे नियंत्रक में कार्यान्वित कर सकते हैं ... यह एकमात्र तरीका है जिसे मैं स्टोर में ईवेंट असाइन कर सकता हूं और अभी भी नियंत्रण में तर्क लागू कर सकता हूं। मुझे उम्मीद है यह मदद करेगा


आण्विक मनुष्य के जवाब के लिए यहां एक वैकल्पिक वाक्यविन्यास है।

लिखने के बजाय,

init : function () {
    this.getUsersStoreStore().addListener('write',this.finishedLoading, this);
    this.control({
        // widgets event handlers
    });
},

तुम लिख सकते हो

init : function () {
    this.getUsersStoreStore().on({
        write: this.finishedLoading,
        scope: this
    });
    this.control({
        // widgets event handlers
    });
},

मुझे लगता है कि यह वैकल्पिक परिभाषा थोड़ा बेहतर पढ़ती है।

मैंने इसे एक जवाब से लिया Izhaki मुझे दिया।





extjs4