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

Lots of TypeError: fnPtr is not a function in angularJs

本文关键字:angularJs 函数 不是 fnPtr 多类型 错误      更新时间:2024-01-09

我目前正在扩展别人创建的angularjs应用程序,在用grunt构建它后遇到了问题。尽管该网站确实可以工作,但我在控制台中收到了很多TypeError: fnPtr is not a function错误。错误堆栈并没有真正的帮助,但我设法在我的应用程序中找到了两个不同的点,它们在这些堆栈中命名:

  1. 第一个是解决此错误的方法:https://github.com/angular/angular.js/issues/2621.我相信这实际上已经不再需要了(因为我们使用的是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文件中的同一个位置也会被命名,看起来确实像这样(片段):

    $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();
            });
        }
    

所有vendor js文件都被"编译"成一个vendor.js文件。奇怪的是,当我使用这个编译过的vendor.js的旧版本时,它确实可以正常工作。我已经尝试过对这两个文件进行比较,看看是否有版本不匹配,但我找不到任何关键的东西。有人知道这里会发生什么吗?当我跳过构建过程,只单独使用每个.js文件时,也会发生这种情况。

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