Javascript TypeError:undefined不是角度资源中的函数
当尝试在AngularJS资源上轮询自定义方法Javascript TypeError:undefined不是角度资源中的函数,javascript,angularjs,angularjs-directive,angularjs-scope,angularjs-resource,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,Angularjs Resource,当尝试在AngularJS资源上轮询自定义方法copies时,我在angular.js:10033处遇到以下错误:(方法copy工作正常。) Angular.js 10016-10035: function consoleLog(type) { var console = $window.console || {}, logFn = console[type] || console.log || noop, hasApply = false; // Note:
copies
时,我在angular.js:10033
处遇到以下错误:(方法copy
工作正常。)
Angular.js 10016-10035:
function consoleLog(type) {
var console = $window.console || {},
logFn = console[type] || console.log || noop,
hasApply = false;
// Note: reading logFn.apply throws an error in IE11 in IE8 document mode.
// The reason behind this is that console.log has type "object" in IE8...
try {
hasApply = !!logFn.apply;
} catch (e) {}
if (hasApply) {
return function() {
var args = [];
forEach(arguments, function(arg) {
args.push(formatError(arg));
});
return logFn.apply(console, args); // This is line 10033 where the error gets thrown.
};
}
简化资源:
angular.module('vgm.content-pages')
.factory('ContentPage', function($resource, $http) {
return $resource('/api/content-page/:id', { id:'@page.id' }, {
copy: {
method: 'POST',
url: '/api/content-page/copy/:id'
},
copies: {
method: 'GET',
isArray: true,
url: '/api/content-page/copies/:id'
}
});
});
mod.factory('Ansprechpartner', ['$resource',
function ($resource) {
return $resource('/api/Ansprechpartner/:id',
{ id: '@ID' },
{
"update": { method: "PUT" },
"searchByName": { method: "GET", url: "/api/Ansprechpartner/searchByName/:name", isArray: true }
}
);
}
]);
得到错误的简化指令:
angular.module('vgm.genericForms')
.directive('vgmFormCopyPicker', function() {
return {
restrict: 'E',
replace: true,
templateUrl: '/static/common/generic-forms/widgets/view-copy-picker.html',
scope: {
resource: '=',
},
controller: function($scope, $element) {
$scope.pages = [];
$scope.loadCopies = function() {
$scope.resource.$copies()
.then(function(response) {
$scope.pages = response.data;
});
};
}
};
});
只要运行loadCopies
方法,执行行$scope.resource.$copies()
就会抛出上面的错误
在Chrome Inspector中,我看到对API的调用实际上已经完成。但解决承诺似乎会带来一些错误
如何解决此错误
编辑:
Angular Resource正在尝试用项目数组覆盖我的初始资源。但是Resource的实例当然没有方法push
。我找到了答案:
资源应该在其剩余生命周期内表示匹配的数据对象。如果要获取新数据,应使用新对象
$scope.copies = ContentPage.copies()
Guido的回答是正确的,但我第一次没有得到 如果您将自定义方法添加到您的
$resource
中,并使用isArray:true
,希望从您的Web服务中获得一个数组,您可能希望将响应存储在一个数组中
因此,您不应该像这样使用实例方法:
var ap = new Ansprechpartner();
$scope.nameDuplicates = ap.$searchByName(...);
但是直接使用资源:
$scope.nameDuplicates = Ansprechpartner.searchByName(...)
使用以下角度资源:
angular.module('vgm.content-pages')
.factory('ContentPage', function($resource, $http) {
return $resource('/api/content-page/:id', { id:'@page.id' }, {
copy: {
method: 'POST',
url: '/api/content-page/copy/:id'
},
copies: {
method: 'GET',
isArray: true,
url: '/api/content-page/copies/:id'
}
});
});
mod.factory('Ansprechpartner', ['$resource',
function ($resource) {
return $resource('/api/Ansprechpartner/:id',
{ id: '@ID' },
{
"update": { method: "PUT" },
"searchByName": { method: "GET", url: "/api/Ansprechpartner/searchByName/:name", isArray: true }
}
);
}
]);
我正在使用
Mean.js
,这困扰了我几个小时。有一个内置的$update
,但当我试图将它应用于$resource
返回的对象时,它不起作用。为了让它工作,我必须改变调用资源来更新它的方式
例如,对于Student
模块,我将它与$resource
一起返回到$scope.Student
中。当我试图更新student时,$update
返回此错误。通过将调用修改为Students.update()
它解决了这个问题
$scope.update=function(){
var student=$scope.student;
var结果=student.update(student);
如果(结果){
$scope.message='Success';
}否则{
$scope.error=
“对不起,出了点问题。”;
}
};代码>谢谢Guido。我也有同样的问题。我觉得这些文件有点混乱。如果我理解正确,就不能在/single/resource实例上调用isArray:true的实例方法,因为该实例不是数组。这是正确的。如果你仔细想想,它是有意义的:首先属性表示一个项目列表,然后突然它表示一个项目,这是不一致的。