extjs - एक्स्टजेएस आवेदन घटना संकट




extjs4 extjs-mvc (3)

Approach # 3 (this.application.fireEvent ('showThatAwesomeView')) एक महान समाधान है आवेदन ईवेंट के उपयोग के नियंत्रकों में परिणाम है जो इस घटना से संबंधित आवेदन से अन्य तर्कों को जोड़ा या निकाला जा सकता है।

नियंत्रकों के बारे में आपकी चिंता के संबंध में, घटनाओं के लिए सही तरीके से बाध्य होने के समय में विस्तारित किया गया, Ext.app.Application नियंत्रक का उपयोग इस को समाप्त करेगा। एप नियंत्रक सभी निर्दिष्ट नियंत्रक को इनिशियलाइज़ करते हैं जब ऐप इनिशियलाइज़ होता है। आपने नियंत्रकों की संख्या से संबंधित स्टार्ट-अप समय के बारे में चिंता का उल्लेख किया मैंने कई एकल पृष्ठ ऐप्स पर काम किया है जो कुछ मामलों में दर्जनों और भी सैकड़ों नियंत्रक हैं। न्यूनतम में किसी भी इनिट तर्क को रखते हुए किसी भी ध्यान देने योग्य मंदी को कम करना चाहिए। ऑन-डिमांड लोडिंग की जगह मिनएफ़ेड और संयुक्त लिपियों ने ऐप स्टार्ट-अप को बहुत तेज़ रखने के लिए अच्छी तरह से काम किया है।

GetController विधि से बचना अच्छा अभ्यास है तर्क तर्क के स्थान पर अनुप्रयोग इवेंट का प्रयोग करते समय अनुप्रयोग तर्क बेहतर ढंग से संगठित होता है, जो एक दूसरे के साथ कसकर जोड़ों के नियंत्रक होते हैं

EXTJS 4.1

मैंने एक पहेली का थोड़ा सा भाग लिया है और एक्स्टजेएस की घटनाओं और नियंत्रक विधियों के बारे में इस परिदृश्य पर कुछ अन्य डेवलपर्स इनपुट सुनना अच्छा लगेगा I मैं समझता हूं कि इस विषय को कई अवसरों पर कवर और बहस किया गया है, लेकिन मुझे लगता है कि यह कुछ और जानकारियों का इस्तेमाल कर सकता है।

मानक अभ्यास के रूप में, मैं अपने नियंत्रक के init() विधि घोषणा में ईवेंट श्रोताओं को निम्नानुसार परिभाषित करता हूं:

Ext.define("My.controller.Awesome", {
init: function(application){
    /** Observe some Views */
    this.control({
        'my-awesome-view #saveButton':{
             click: this.saveMyData
         }
    });

    /** Listen for Events, too! */
    this.on({
        showAwesomeView: this.showMyAwesomeView
    });

    /** Application events, what fun! */
    this.application.on({
        showThatAwesomeView: this.showMyAwesomeView
    });
}

अब, जैसा कि मैं कुछ अन्य नियंत्रक में कुछ कार्यक्षमता को कोडित करने के बारे में ख़ुशी से जाना जाता हूं, मुझे खुद को showMyAwesomeView को My.controller.Awesome में कॉल करने की ज़रूरत है। मैं इसे कुछ अलग तरीकों से कर सकता हूं ...

Ext.define("My.controller.Other", {

    /* ... class definition */

    someImportant: function(){

        // I can do this (Approach #1)
        this.application.getController("Awesome").showMyAwesomeView();

        // Or I can do this (Approach #2)
        this.application.getController("Awesome").fireEvent("showAwesomeView");

        // Last but not least, I can do this (Approach #3)
        this.application.fireEvent("showThatAwesomeView");
    }
});

मेरे लिए, Approach # 3 सबसे 'सही' लगता है मेरी समस्या यह है कि अगर मैंने My.controller.Awesome इन्स्तांत नहीं किया है, My.controller.Awesome इससे पहले, init() विधि अभी तक नहीं चल रही है और इसलिए कोई भी श्रोताओं की स्थापना नहीं हुई है, इसलिए निकाल दी गई घटना रहस्य भूमि में कभी बंद नहीं हुई फिर।

controller.init() लौटने से पहले, मुझे नियंत्रक. init Ext.application.getController() को कॉल controller.init() लिए Ext.application.getController() ओवरलोड controller , इसलिए एक नियंत्रक के रूप में जैसे ही इसे लोड किया जाता है (आमतौर पर किसी अन्य नियंत्रक में निर्भरता के रूप में) के रूप में इसकी init विधि को बुलाया जाता है। क्या यह बुरा है?

लोड समय को बचाने के लिए (मेरा आवेदन काफी बड़ा है) मेरे नियंत्रक और उनकी निर्भरताएं एक आवश्यक-आवश्यक आधार पर लोड होती हैं I इसलिए, मेरे अधिकांश नियंत्रकों (और विचारों और डेटा स्टोर) का शुरुआतीकरण नहीं किया जाता है, जब मेरा एप्लिकेशन पहले बूट करता है इसलिए इनिट () 'एड नहीं होता है जो एप्लिकेशन-चौड़ा घटनाओं को काफी जटिल बनाता है।

मुझे लगता है कि मैं यहाँ कुछ बड़ा लापता हो सकता है, या शायद मुझे बुलेट काटने की ज़रूरत है और यह सुनिश्चित करना है कि घटनाओं के फायरिंग से पहले मेरे नियंत्रक इनरिट कर रहे हैं। मुझे लगता है कि मैं मुख्य आवेदक फाइल में घटना श्रोताओं की एक बहुत ही भयावह संख्या भी डाल सकता हूं और अपने तरीकों को तदनुसार फोन करने से पहले नियंत्रक को संभालता हूं, लेकिन यह बहुत ही ढलान और बनाए रखने में मुश्किल लगता है।

किसी भी इनपुट की सराहना की जाएगी, अपने समय के लिए धन्यवाद!


Ext.define('UD.controller.c1', {
    extend: 'Ext.app.Controller',
    refs: [
            {
                selector: 'viewport',
                ref: 'userview'
            }
          ],
    init: function() {
        console.log("initincontroller!!");
        this.control({
            'viewport > panel': {
                render: this.onPanelRendered
            }
        });
    },
    onPanelRendered:function(){
        alert("rendered");
        UD.getApplication().fireEvent('myevent');
    }
});



Ext.define('UD.controller.c2', {
    extend: 'Ext.app.Controller',
    refs: [
            {
                selector: 'viewport',
                ref: 'userview'
            }
          ],
    init: function() {
        console.log("initincontroller!!");
            UD.getApplication().on({
                myevent : this.doSomething
             });
    },
    doSomething:function(){
        alert("controller2");
    }
});

समय के साथ हैंडल करने के लिए सबसे आसान तरीका

function myFunc (terminator = false) {
    if(terminator) {
        clearTimeout(timeOutVar);
    } else {
        // do something
        timeOutVar = setTimeout(function(){myFunc();}, 1000);
    }
}   
myFunc(true); //  -> start loop
myFunc(false); //  -> end loop