كيف يمكن إزالة دوجو مرتبطة الحدث إذا لم يكن لديك "مقبض" التي تم إرجاعها خلال dojo.connect؟

StackOverflow https://stackoverflow.com/questions/1214624

  •  06-07-2019
  •  | 
  •  

سؤال

وكيف قمت بإزالة دوجو الحدث متصلا إذا لم يكن لديك "مقبض" التي تم إرجاعها خلال dojo.connect؟

وبلدي سبيل المثال يتضمن تعيين مجموعة من الأحداث بشكل ديناميكي لمجموعة من الكائنات. (للبساطة، والأحداث عند _ النقر وondblclick، والكائنات والصفوف داخل جدول)

وهكذا، خلال ترتبط الأحداث إعداد الصفحة إلى كل صف (عند _ النقر، ondblclick). الآن، وهذا يتوقف على المستخدم يرغب / الإجراءات، والحاجة إلى إزالة حدث واحد من صف واحد هو مطلوب. لكن المؤشر الأصلي لم يعد متاحا. وبسبب هذا التالية سوف لا تعمل: dojo.disconnect(row, "onclick", ??*). كيف يمكنني الحصول على حول هذا بدون تقطيع هيكل الصف الأصلي؟

وأي مساعدة هي بالطبع تقدير كبير.

هل كانت مفيدة؟

المحلول

وماذا أفعل عادة هو حفظ مقابض عندما خلق لهم حتى أتمكن من قطع الاتصال بها في وقت لاحق. شيء من هذا القبيل:

 var connects = {};

 // then later on
 var node = dojo.create(....); // or someting else that gives you a node
 dojo.forEach( ['click','ondblclick' ], function( evt, idx ) {
   if (!connects[node.id]) {
     connects[node.id] = [];
   }
   connects[ node.id ][idx] = dojo.connect( node, evt, function(evt) { .... });
 });

وبعد ذلك في وقت لاحق، على أن تتمكن من قطع مثل:

 dojo.forEach( connects[node.id], function( handle ) {
   dojo.disconnect( handle );
 });

وهناك نموذج التعليمات البرمجية مشابهة لهذا في dojocampus

نصائح أخرى

والجواب على سؤالك هو أن من المستحيل فصل الحدث إذا كنت قد فقدت "التعامل" التي تم إرجاعها خلال العملية dojo.connect. إلا إذا كنت على استعداد للقيام القرصنة الثقيلة من التعليمات البرمجية دوجو نفسها.

ويجب تخزين هذه في مكان ما إذا كنت ترغب في قطع الاتصال بها في وقت لاحق.

ومثل سيث لدي أنماط بلدي لإزالة الأحداث - I جمع مقابض في صفائف (الزائفة رمز):

var handles = [
  dojo.connect(...),
  dojo.connect(...),
  dojo.connect(...)
];

إذا كنت على اتصال حيوي أنا فقط جمعها:

var handles = [];
...
handles.push(dojo.connect(...));
...
handles.push(dojo.connect(...));

إذا كنت على اتصال العديد من الأحداث بطريقة منتظمة يمكنني استخدام dojo.map():

var handles = dojo.map(["click", "ondblclick"], function(evt){
  return dojo.connect(node, evt, ...);
});

والجزء أنيق هو أن وقت لاحق ويمكن قطع كل منهم مع يدوية أونيلينير:

dojo.forEach(handles, dojo.disconnect);

في قضيتك يمكنك استخدام القاموس مثل أبداه سيث لإنجاز نفسه:

var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
  return dojo.connect(node, evt, ...);
});

وهكذا في وقت لاحق يمكن للمرء أن تقوم بفصل معالجات مثل هذا:

dojo.forEach(handles[node.id], dojo.disconnect);

ونرى ما اذا كان سيث "واسكتشات بلدي تساعد في قضيتك. إذا لم يكن كذلك، تعطينا المزيد من التفاصيل.

وعلى الرغم من دوجو لايوجد طريقة للقيام بذلك، يمكنك إزالة وظيفة اسمه مع معيار جافا سكريبت:

node.removeEventListener ("click", clickFunction, false);

انظر في العمل هنا . ومع ذلك، يتم اعتماد removeEventListener فقط اعتبارا من IE9 لإنترنت إكسبلورر. يجب أن تعمل على جميع المتصفحات الرئيسية الأخرى.

إذا كان متصلا الحدث إلى القطعة Dijit، يمكنك تجاوز كافة معالجات على الحدث كما يلي:

dijit.byId(widgetid).onClick = function() {
    // click handler or empty function goes here
}

وسيتم استبدال أي وجميع وظائف تعلق على معالج click لأن القطعة التي الجديد الخاص بك فوق معالج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top