Javascript 很多类型错误:fnPtr不是angularJs中的函数

Javascript 很多类型错误:fnPtr不是angularJs中的函数,javascript,angularjs,Javascript,Angularjs,我目前正在扩展由其他人创建的angularjs应用程序,在使用grunt构建它之后遇到了问题。尽管该网站确实有效,但我还是收到了很多TypeError:fnPtr在控制台中不是一个函数错误。错误堆栈并没有真正的帮助,但我在应用程序中找到了两个不同的点,它们在这些堆栈中命名: 第一个是此错误的解决方法:。我相信这实际上已经不再需要了(因为我们使用的是angular 1.2.6,据我所知,这个bug似乎已经修复了)。以下是相关位: ScopePrototype.$watchCollection =

我目前正在扩展由其他人创建的angularjs应用程序,在使用grunt构建它之后遇到了问题。尽管该网站确实有效,但我还是收到了很多
TypeError:fnPtr在控制台中不是一个函数
错误。错误堆栈并没有真正的帮助,但我在应用程序中找到了两个不同的点,它们在这些堆栈中命名:

  • 第一个是此错误的解决方法:。我相信这实际上已经不再需要了(因为我们使用的是angular 1.2.6,据我所知,这个bug似乎已经修复了)。以下是相关位:

    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文件中的同一个点也会被命名,看起来确实像这样(代码片段):

  • 第二种情况更为奇怪(指向
    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();
            });
        }
    
    返回{
    限制:“A”,
    范围:{
    showLeft:“=”,
    showRight:“=”
    },
    控制器:功能($scope){
    $scope.checkVisibility=函数(滚动位置,元素宽度){
    如果(滚动位置=元素宽度){
    $scope.showRight=false;
    }否则{
    $scope.showRight=true;
    }
    如果(!$scope.$parent.$$phase){//防止摘要错误
    $scope.$apply();
    }
    };
    },
    链接:函数($scope、$element、$attr){
    var doCheck=函数(){
    $scope.checkVisibility($element[0]。scrollLeft,$element[0]。scrollWidth-$element[0]。offsetWidth-$attr.rightScrollOffset);
    };
    angular.element($element).scroll(函数(){
    多切克();
    });
    /*使用超时,如$element[0]。子项[0]。offsetWidth现在未准备就绪*/
    $timeout(函数(){
    多切克();
    }, 200);
    /*也设置为“调整大小”*/
    angular.element($window.bind('resize',function()){
    多切克();
    });
    /*还可以在dom节点上设置scroll Div的更改*/
    angular.element($element.bind('DomainNodeInserted-DomainNodeRemoved',函数(事件){
    多切克();
    });
    }
    

  • 所有供应商js文件都已“编译”在一个vendor.js文件中。奇怪的是,当我使用这个编译的vendor.js的旧版本时,它确实可以正常工作。我已经尝试区分这两个文件,以查看是否有版本不匹配,但我找不到任何关键的内容。有人知道这里会发生什么吗?当我跳过构建过程,只看到我们时,也会发生这种情况每个.js文件都有自己的版本。

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

    您提到checkVisibility是一个有问题的点,但没有提供它的源代码。所有相关代码可能都是合适的。请提供错误堆栈(对于“每个.js文件各自独立”的未统一应用程序)让回答者决定这是否有用。不确定你的意思。我发布的两个点是angularjs文件之外的唯一点。我还应该添加什么?啊,我现在明白了。我会发布一次吗back@estus我添加了checkVisibility方法。我认为问题可能从$scope.apply()开始;
    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();
            });
        }