2012-04-25 32 views
24

Sürükle ve bırak ve ajax yüklemeleri için plupload kullanan bir boşaltma bağlayıcı işleyicim var. Nakavt bağlama eylemcisi teardown işlevi?

I sırayla elemanları DOM için olay dinleyicileri bağlayıcı plupload örneğini oluşturmak plupload komut kullanın.

Bu iyi çalışıyor.

Ancak, "klasörler" listesi var ve bir klasörü tıkladığınızda ben o klasördeki dosyaların bir listesini görüntüler. Foreach kullanarak selectedFolder() belgelerini bağlayarak aynı DOM öğelerini yeniden kullanıyorum.

Ben sorun benim bağlayıcı işleyicisinde ben init işlevinde tüm plupload şeyler ve ben DOM öğelerini yeniden beri kendilerine bağlı çoklu olay işleyicileri elde edilmesi. Bu, sürükleme ve bırakma olaylarının alla işleyicilerine gönderilmesine neden olur. Bu, oluşturulmuş dosya listesine bir dosya düşürürsem, açılan etkinliğin önceden oluşturulmuş tüm dosya listelerine de yazdığı anlamına gelir.

Aradığım şey, bir iş listesi gönderilmemiş olduğunda tüm olayların kaydını tutabilmem için (örneğin, bu bir sözcük nedir?), Bağlayıcı işleyicisinde bir tür teardown veya temizleme işlevidir.

Belki de devamsızlığı tespit edemiyoruz? Bunu nasıl halledebilirim? Küresel bir örneğe sahip olmamayı tercih ederim, çünkü bu aynı anda birden fazla yerdeki bağları kullanmamı engelliyordu.

Size herhangi bir kod vermediğim için üzgünüm. Cep telefonumda.

Şerefe!

cevap

32

KO (şablon olduğunda yeniden render gibi) elemanları kaldırır zaman Geri idam edilecek bir işleyici kaydedebilirsiniz.

//handle disposal (if KO removes by the template binding) 
    ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
     $(element).datepicker("destroy"); 
    }); 

Yani, "init" fonksiyonunda sen bağlı olan öğe için dispose geri arama kayıt altına alacak ve size istiyorum ne olursa olsun temizlik kod çalıştırmak için bir fırsat olurdu: gibi görünüyor.

+0

Bu kesinlikle sorunumu çözerdi. Yazık olsa da habersiz denir. Teşekkürler RP! –

+0

Kendi DOM manipülasyonunu yapan diğer kütüphanelerle (tek sayfalık uygulamalarda ortak) karışıyorsanız, aşağıda herhangi bir DOM kaldırmayı tetikleyen jQuery yaklaşımını göz önünde bulundurmak isteyebilirsiniz (sadece knockout tarafından tetiklenenler değil). JQuery'yi zaten referans aldıysanız kullanışlıdır. –

3

Ben Nakavt DOM düğümü (yani o şablonlar rejigs olduğunda) kaldırır biriyse burada sağlanan çözüm yalnızca çalışacağını düşünüyoruz. Belli koşullar altında tetiklemek için zor bir zaman geçirdim. Öğenizin nasıl kaldırıldığına bakılmaksızın yürütülecek bir geri aramaya ihtiyacınız olduğu senaryolar olabilir; Knockout ile mi yoksa jQuery.html() ile mi, (özellikle tek bir sayfa uygulamasında).

Ben jQuery küçük bir yardım ile böyle bir kanca eklemek için farklı bir yaklaşım demlenmiş. Özel olaylar API'sini (iyi tanımlanmış olan here) kullanarak, belirli bir olay bir DOM düğümünden (teardown sırasında gerçekleşen bir şey) removed olduğunda çalıştırılacak bir yöntem ekleyebilirsiniz.

jQuery ile birlikte Knockout kullanıyorsanız, böyle bir şey bakmak için bağlayıcı bir nakavt içine bu sarabilirsiniz:

ko.bindingHandlers.unload = { 
    init: function (element, valueAccessor) { 
     var eventName = 'your_unique_unLoad_event'; // Make sure this name does not collide 
     if (!$.event.special[eventName]) { 
      $.event.special[eventName] = { 
       remove: function (o) { 
        o.data.onUnload() 
       } 
      }; 
     } 
     $(element).on(eventName, { onUnload: valueAccessor()}, $.noop); 
    } 
}; 

Daha sonra, bu gibi herhangi bir element bu kullanabilirsiniz:

<div id="withViewModelMethod" data-bind="unload: aMethodOnMyViewModel" /> 
<div id="withInLineMethod" data-bind="unload: function() { /* ... */ }" /> 

Bu SO post kredisine borçluyum.

+0

Bunun nasıl çalıştığını bilmiyorum ** var eventName = '_unique_unLoadEventName ____ 12345'; ** Sadece anlamaya çalışıyorum çünkü benzer bir duruma düştüm. – nimgrg

+0

Bu sadece bir şapkadan çıkardığım bir ip. İstediğiniz herhangi bir şey olabilir, sadece benzersiz olduğundan emin olmak istedim ve kendi etkinlik işleyicilerini ekleyebilecek diğer eklentiler veya 3. taraf kodlarıyla çarpışmak istemedim. Bu örnekte biraz abartılı .. –

+0

belki de '_unique_unLoadEventName____12345' adresini 'your_unique_unLoad_event' olarak değiştirebilirsin –