我目前正在扩展由其他人创建的angularjs应用程序,并且在使用grunt构建它之后遇到了问题。即使该网站确实有效,我在控制台中也会遇到很多TypeError: fnPtr is not a function
错误。错误堆栈实际上没有用,但我设法在我的应用程序中找到两个不同的位置,这些位置在这些堆栈中命名:
第一个是针对此错误的解决方法: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;
第二次出现甚至更奇怪(指向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();
});
}
所有供应商js文件都被“编译”到一个vendor.js文件中。奇怪的是,当我使用这个编译过的vendor.js的旧版本时,它确实可以正常工作。我已经尝试区分两个文件,看看是否有任何版本不匹配,但我找不到任何关键的东西。任何想法可能会发生什么?当我跳过构建过程并且单独使用每个.js文件时,也会发生这种情况。
答案 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
(我正在使用)兼容。