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