很多TypeError:fnPtr不是angularJs

时间:2016-04-05 23:10:01

标签: javascript angularjs

我目前正在扩展由其他人创建的angularjs应用程序,并且在使用grunt构建它之后遇到了问题。即使该网站确实有效,我在控制台中也会遇到很多TypeError: fnPtr is not a function错误。错误堆栈实际上没有用,但我设法在我的应用程序中找到两个不同的位置,这些位置在这些堆栈中命名:

  1. 第一个是针对此错误的解决方法:https://github.com/angular/angular.js/issues/2621。我确实认为这实际上不再需要了(因为我们使用的是角度1.2.6,据我所知,这个版本似乎已经修复了这个版本)。这是相关的一点:

    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);
                    ....}
    

    错误指向:newValue = objGetter(self);。即使我从我的代码中删除了这个变通方法,angular.js文件中的相同位置也会被命名,这看起来像这样(片段):

    $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. 第二次出现甚至更奇怪(指向doCheck)。这只是一个简单的指令:

    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();
            });
        }
    
  3. 所有供应商js文件都被“编译”到一个vendor.js文件中。奇怪的是,当我使用这个编译过的vendor.js的旧版本时,它确实可以正常工作。我已经尝试区分两个文件,看看是否有任何版本不匹配,但我找不到任何关键的东西。任何想法可能会发生什么?当我跳过构建过程并且单独使用每个.js文件时,也会发生这种情况。

1 个答案:

答案 0 :(得分:0)

我发现了问题。经过两个文件的大量差异操作后,我注意到angular-bootstrap-tpls库之间的不匹配。较旧的vendor.js文件使用版本0.10.0,我使用0.11.2。 这很奇怪,因为即使bower.json文件需要angular-bootstrap: "~0.10.0",bower也不会让我安装版本0.10.0。版本0.11.2也应该与角度版本1.2.6(我正在使用)兼容。