سؤال

لقد أرى أن يمتد Ext.grid.Panel وأريد أن أكون قادرًا على سؤال المستخدم عما إذا كان يريد حقًا إغلاق اللوحة بعد النقر فوق [X].حاولت مع

listeners: {
            beforedestroy: function() {
                               //console.log('In');
                return false;
            }
        },

ولكن من الواضح أن الأمر ليس بهذه البساطة.هل هناك أي أفكار حول كيفية منع إغلاق اللوحة؟

شكرًا

ليرون

ملاحظة.

هذا ما أحصل عليه من منتديات sencha، ولم أختبره بعد:

Ext.create( 'Ext.window.Window', {
    title: 'test',
    width: 200,
    height: 200,
    listeners: {
        beforeclose: function( window ) {
            Ext.Msg.confirm( 'Hey', 'Are you sure you want to close?', function( answer ) {
                if( answer == "yes" ) {
                    window.destroy();
                }
            } );
            return false;
        }
    }
} ).show(); 
هل كانت مفيدة؟

المحلول

beforeclose يجب أن يعمل الحدث.لا؟

تحديث:

إذا كنت ترغب في الحصول على بعض تفاعل المستخدم (أيسؤال التأكيد أو حفظ البيانات أو شيء من هذا القبيل) سيكون الأمر صعبًا بعض الشيء ...

أولاً، في مُنشئ العرض، افعل شيئًا مثل هذا:

this.on('beforeclose', function() { 
   return this.myCloseHandler(function() { this.close(); }, this);
});
this.alreadyAsked = false;

من إنشاء معالج:

myCloseHandler: function(callback, scope) {
    if (this.alreadyAsked === false) {
        this.alreadyAsked = true;
        Ext.MessageBox.show({
            msg: 'Are you sure?',
            fn: function(btn) {
               if (btn == 'yes')
                  Ext.callback(callback, scope);
               else 
                  this.alreadyAsked = false;   
            }
        });
        return false;

    }
    return true;   
}

الفكرة هي أنك تقوم بإرجاع خطأ على الفور ولكن لديك بعض العلامات والشروط لتمرير نفس المنطق دون تأكيد.

نصائح أخرى

التقنية التي أستخدمها هي ببساطة إخفاء النافذة بدلاً من التدمير الافتراضي للنافذة وإضافة مستمع للحدث قبل الإخفاء.وهذا يمنع تدمير جميع المكونات الموجودة في نافذتك والتي تريد منع تدميرها على أي حال.يعد حدث الإخفاء حدثًا بريئًا تمامًا لهذا.ثم يأتي Ext.msg، ربما حتى بشرط معين فقط.وردك على رسالة الاستراحة أنهى المهمة.وإلا فلا ضرر، لأن الكذبة عادت.

var win = Ext.create('Ext.window.Window', {
       .... your window specs ...
       closeAction : 'hide',
       buttons : [{
            text    : 'Close',
            scope   : me,
            handler : function() {
                win.hide(); // not destroy !!! that comes later !!!
            }
        }],
        listeners : {
            scope  : me,
            'beforehide' : function(window) {
                if (some_condition == true) {
                    Ext.Msg.confirm( 'Confirm close of window', 'You really wanna close this window ?', function( answer ) {
                        if( answer == "yes" ) {
                            window.destroy();
                        }
                    });
                    return false;
                }

            },
            'destroy' : function(window) {
                  // do something after the window destruction //
                  alert('Another window smashed');
            }
        }
        ... rest of your window specs
  });

ربما ليست هناك حاجة للإنشاءات الثقيلة.الأعمال التالية مثالية بالنسبة لي:

beforeclose: function(window) {
    Ext.Msg.confirm("Hey", "Are you sure you want to close?", function(answer) {
        if (answer == "yes") {
            window.events.beforeclose.clearListeners();
            window.close();
        }
    });
    return false;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top