2013-04-11 34 views
5

$ rootScope'ta ($$ yayını kullanarak) bir olay yayınlayan bir açısal komut dosyası var.

Yakalanmayan TypeError: açısal ben kullanıyorum sürümü Bazı kez 1.1.4

, bu açısal kod içinde bir istisna atar olan null '$$ nextSibling' özelliğini okuyamaz.

Bu hataya ne neden olabileceğine dair bir ipucu var mı? Ne yazık ki, bu hatanın meydana geldiği kod postalamaktan büyüktür, ama belki birisi bana doğru yönde işaret edebilir?

gerçekleşmeden açısal kodudur:

iken ekstresinde
// Insanity Warning: scope depth-first traversal 
     // yes, this code is a bit crazy, but it works and we have tests to prove it! 
     // this piece should be kept in sync with the traversal in $digest 
     if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) { 
     while(current !== target && !(next = current.$$nextSibling)) { 

güncelleme: yayın harici bileşen tıklama etkinlik üzerinde tıklanan olay içinden istediğinde kullanılmaktadır bir özelliktir Harici bileşen için bir yapılandırma nesnesi.

+0

Ouch. Bu kodun tüm kapsamları bulmak için bir özet döngüsü sırasında çalıştığını düşünüyorum. 'Geçerli' tanımlanmamış görünüyor. Scope'larda garip bir şey mi yapıyorsun? kendiniz yaratmak veya el ile yok etmek gibi mi? –

+0

farkında olduğumu değil ... durumun hakkında daha fazla bilgi için güncelleme konusuna bakın. – rekna

cevap

-2

Sorun, kullanım kapsamındaki $$ uygulamasının kullanımında veya kullanılmamasında yatar. Bazen, başvuru aşamasında olduğum diğer vakalarda $$ başvurusu kullanmam gerekiyordu ... Sp, safeApply uygulamasına son verdim (internette bir yerlerde bulundu). o uygulamak gerçekten basit olduğu için bu açısal uygulanan standart değil neden acaba ve o kadar iyi çalışan bir bekleme süresi olmadan

+1

Tüm downvotes nedenini merak ediyor olabilirsiniz. Peki, bahsettiğiniz şey, Açısal takım tarafından bir anti-desen olarak kabul edilir. "Güvenli uygulama" yaklaşımı işe yaramasına rağmen, bu uygun bir çözüm değildir. $ Timeout() öğesinde bir şeyler silmekten daha iyi olursunuz, böylece kodunuz bir sonraki özet sırasında düzgün bir şekilde uygulanır. Anti-desen ile ilgili buraya bakın: https://github.com/angular/angular.js/wiki/Anti-Patterns – mikesigs

12
$timeout(function(){ 
    //do stuff 
}); 

$timeout kodlama basitleştirir.

+1

Bahşiş için çok teşekkürler! Bu $ scope. $ On ($) ($) gibi bir işlev için $ harcamam gerekiyordu ($ timeout (...() {myStuff();})}. Hayal kırıklığı saatlerinden sonra! Bu açısal 1.0.8 kullanıyor. – xeor

+0

Bu benim için çalıştı ... Teşekkürler .. :) –

+0

Teşekkürler. Bir kaç saat hayal kırıklığı yaşadım Eminim! –