2016-04-05 19 views
0

Şu anda bir başkası tarafından oluşturulan bir angularjs uygulamasını genişletiyorum ve homurdanarak oluşturduktan sonra sorunlara koşuyorum. Site çalışmıyor olsa bile konsolda çok sayıda TypeError: fnPtr is not a function hata alıyorum. Hata yığın gerçekten yararlı değildir, ancak ben bu yığınlar içine adlandırılır benim uygulama içinde iki ayrı noktalar bulmayı başardılar:Çok sayıda TypeError: fnPtr, angularJs içinde bir işlev değil

  1. İlki bu hata için geçici bir çözümdür: https://github.com/angular/angular.js/issues/2621. Bunun artık gerekli olmadığına inanıyorum (açısal 1.2.6 kullanıyoruz ve bu hatanın bu sürüm için düzeltildiğini söyleyebilirim).

    ScopePrototype.$watchCollection = function(obj, listener) { 
          var self = this; 
          var oldValue; 
          var newValue; 
          var changeFlipFlop = 0; 
          var objGetter = $parse(obj); 
          var internalArray = []; 
          var internalObject = {}; 
          var internalLength = 0; 
    
          var internalValue = initWatchVal; 
    
          function $watchCollectionWatch() { 
           var newLength, key, i, changeDetected; 
    
           newValue = objGetter(self); 
           ....} 
    

    hata noktaları için: newValue = objGetter(self); bir noktada İşte alakalı biraz. ben bu (pasajı) benziyor angularjs dosyası içinde aynı nokta adlı alır kodumu, bu geçici çözümü kaldırmak bile:

    $watchCollection: function(obj, listener) { 
        var self = this; 
        var oldValue; 
        var newValue; 
        var changeDetected = 0; 
        var objGetter = $parse(obj); 
        var internalArray = []; 
        var internalObject = {}; 
        var oldLength = 0; 
    
        function $watchCollectionWatch() { 
         newValue = objGetter(self); 
         var newLength, key; 
    
  2. ikinci oluşumu (doCheck için puan) bile yabancı değil. Tüm satıcının js dosyaları tek vendor.js dosyasına "derlenmiş" alıyorsanız

    return { 
        restrict: 'A', 
        scope: { 
         showLeft: '=', 
         showRight: '=' 
        }, 
        controller: function ($scope) { 
         $scope.checkVisibility = function(scrollPosition, elementWidth){ 
          if(scrollPosition <= 0) { 
           $scope.showLeft = false; 
          } else { 
           $scope.showLeft = true; 
          } 
          if(scrollPosition >= elementWidth) { 
           $scope.showRight = false; 
          } else { 
           $scope.showRight = true; 
          } 
    
          if(!$scope.$parent.$$phase) { // Prevent digest error 
           $scope.$apply(); 
          } 
         }; 
        }, 
    link: function($scope, $element, $attr) { 
         var doCheck = function(){ 
          $scope.checkVisibility($element[0].scrollLeft, $element[0].scrollWidth - $element[0].offsetWidth - $attr.rightScrollOffset); 
    
         }; 
    
         angular.element($element).scroll(function(){ 
          doCheck(); 
         }); 
    
         /* use timeout, as $element[0].children[0].offsetWidth is not being ready now */ 
         $timeout(function(){ 
          doCheck(); 
         }, 200); 
    
         /* also set on resize */ 
         angular.element($window).bind('resize',function(){ 
          doCheck(); 
         }); 
    
         /* also set on dom node changes of scroll Div */ 
         angular.element($element).bind('DOMNodeInserted DOMNodeRemoved', function(event) { 
          doCheck(); 
         }); 
        } 
    

: Bu sadece basit bir yönerge olduğunu. Garip olan şey, bu derlenmiş vendor.js'nin daha eski bir sürümünü kullandığımda sorunsuz çalışmasıdır. Herhangi bir sürümün uyumsuzluğunu görüp görmediğini görmek için her iki dosyayı da değiştirmeye çalıştım, ancak kritik bir şey bulamadım. Burada olabilecek herhangi bir fikir var mı? Ayrıca, yapı işlemini atladığımda ve her bir .js dosyasını kendi başına kullandığımda da olur.

+0

CheckVisibility'yi sorunlu nokta olarak belirtiyorsunuz, ancak bunun kaynağını sağlama. İlgili tüm kodlar uygun olabilir. Lütfen, hata yığınını sağlayın ('her bir .js dosyası kendi başına olduğunda', kaldırılmamış uygulama için) ve yardımcıların yardımcı olup olmadığına karar vermesine izin verin. – estus

+0

Ne demek istediğinden emin değilim. Gönderdiğim 2 nokta angularjs dosyasının dışındakiler. Başka ne eklemeliyim? – puelo

+0

Ah şimdi görüyorum. Bir kez iam geri gönderecek – puelo

cevap

0

Sorunu buldum. Her iki dosyada bir çok fark eyleminden sonra açısal-bootstrap-tpls kütüphaneleri arasında bir uyumsuzluk fark ettim. Eski vendor.js dosyası 0.10.0 sürümünü kullandı ve 0.11.2 kullanmıştım. Oldukça garip, çünkü bower.json dosyası angular-bootstrap: "~0.10.0" gerekli olsa bile bower 0.10.0 sürümünü yüklememe izin vermez. Ayrıca, sürüm 0.11.2, 1.2.6 (kullandığım) açısal sürümle uyumlu olmalıdır.

İlgili konular