很多类型错误:fnPtr不是angularJs中的函数
Lots of TypeError: fnPtr is not a function in angularJs
我目前正在扩展别人创建的angularjs应用程序,在用grunt构建它后遇到了问题。尽管该网站确实可以工作,但我在控制台中收到了很多TypeError: fnPtr is not a function
错误。错误堆栈并没有真正的帮助,但我设法在我的应用程序中找到了两个不同的点,它们在这些堆栈中命名:
-
第一个是解决此错误的方法: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;
-
第二次出现更为奇怪(指向
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
(我正在使用)兼容。
- 理解AngularJS函数$arguments
- 使用emailyak在angularjs函数中发送电子邮件
- 在jQuery中调用AngularJS函数
- angularJS函数的Doxygen注释
- 指令中的AngularJS函数()与函数factory()
- 如何使用表行id作为angularjs函数的参数
- ng中的Angularjs函数重复调用过多次
- AngularJS 函数,带和不带 '$' 的参数之间的差异
- 如何构建将在多个页面上使用的 AngularJS 函数
- 将 Django 变量作为 AngularJS 函数参数发送
- AngularJs 函数形式未定义
- AngularJS - 函数永远不会得到控制
- 后端对这个 AngularJS 函数的响应应该是什么
- 在 javascript 中使用 angularjs 函数返回
- 将 Javascript 函数转换为 AngularJS 函数
- 如何将文本区域内容传递给 angularjs 函数
- AngularJS函数在多次异步服务调用后
- JavaScript 函数在 angularjs 函数中不起作用
- AngularJS函数,以$q承诺递增数字
- Angularjs函数含义