TypeError: value.push is not a function with Angularjs $resource query
TypeError: value.push is not a function with Angularjs $resource query
我正在从服务器返回一组对象:
[{id: 1, name: "name"},{id: 2, name: "name2"}]
现在我使用 angular-resource $query
来获取数据,因为它需要一个数组。
收到数据后出现此错误:
TypeError: value.push is not a function
服务器的响应是否有问题=?
错误来源:
// jshint +W018
if (action.isArray) {
value.length = 0;
forEach(data, function(item) {
if (typeof item === "object") {
value.push(new Resource(item));
} else {
// Valid JSON values may be string literals, and these should not be converted
// into objects. These items will not have access to the Resource prototype
// methods, but unfortunately there
value.push(item);
}
});
} else {
shallowClearAndCopy(data, value);
value.$promise = promise;
}
}
控制器:
var stream = [];
stream = new VideoStream({param: 'streamTypes'});
stream.$query();
服务:
app.service('DataService', [
'$resource', 'Common', '$rootScope',
function($resource, Common, $rootScope) {
return $resource($rootScope.appWebRoot + "myUrl/:param", {param: '@param'},
{
});
}
]);
视频流:
app.service('VideoStream', [
'$resource', 'Common', '$rootScope',
function($resource, Common, $rootScope) {
return $resource($rootScope.appWebRoot + "videoStreams/api/:param",
{param: '@param'},
{
});
}
]);
您遇到的问题是您正在将资源实例创建为对象
var stream = [];
stream = new VideoStream({param: 'streamTypes'}); //This is the problem. $resource is expecting an array.
stream.$query(); //This is an instance method.
//All you need to do is:
var stream = [];
stream = VideoStream({param: 'streamTypes'}).query();
来自https://docs.angularjs.org/api/ngResource/service/$resource:
$资源returns:
A resource "class" object with methods for the default set of resource
actions optionally extended with custom actions. The default set
contains these actions:
{ 'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} };
Calling these methods invoke an $http with the specified http method,
destination and parameters. When the data is returned from the server
then the object is an instance of the resource class. The actions
save, remove and delete are available on it as methods with the $
prefix
除了Wawy's answer, according to the docs here:
The action methods on the class object or instance object can be
invoked with the following parameters:
- HTTP GET "class" actions: Resource.action([parameters], [success], error])
- non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
- non-GET instance actions: instance.$action([parameters], [success], [error])
查看控制器中VideoStream
的值,我们发现:
function Resource(value) {
shallowClearAndCopy(value || {}, this);
} // Actual Resource class object with regular action(s) we can work with
有
呼叫 VideoStream({param: 'streamTypes'})
returns:
undefined // Cannot call anything of undefined
和new VideoStream({param:'streamTypes'})
returns:
Resource {param: "streamTypes"}
// Instance of the Resource class (an object) where $action(s) are available
// Verified in the chrome console
考虑到这一点,案例应该是:
var stream = [];
stream = VideoStream.query({param: 'streamTypes'});
我正在从服务器返回一组对象:
[{id: 1, name: "name"},{id: 2, name: "name2"}]
现在我使用 angular-resource $query
来获取数据,因为它需要一个数组。
收到数据后出现此错误:
TypeError: value.push is not a function
服务器的响应是否有问题=?
错误来源:
// jshint +W018
if (action.isArray) {
value.length = 0;
forEach(data, function(item) {
if (typeof item === "object") {
value.push(new Resource(item));
} else {
// Valid JSON values may be string literals, and these should not be converted
// into objects. These items will not have access to the Resource prototype
// methods, but unfortunately there
value.push(item);
}
});
} else {
shallowClearAndCopy(data, value);
value.$promise = promise;
}
}
控制器:
var stream = [];
stream = new VideoStream({param: 'streamTypes'});
stream.$query();
服务:
app.service('DataService', [
'$resource', 'Common', '$rootScope',
function($resource, Common, $rootScope) {
return $resource($rootScope.appWebRoot + "myUrl/:param", {param: '@param'},
{
});
}
]);
视频流:
app.service('VideoStream', [
'$resource', 'Common', '$rootScope',
function($resource, Common, $rootScope) {
return $resource($rootScope.appWebRoot + "videoStreams/api/:param",
{param: '@param'},
{
});
}
]);
您遇到的问题是您正在将资源实例创建为对象
var stream = [];
stream = new VideoStream({param: 'streamTypes'}); //This is the problem. $resource is expecting an array.
stream.$query(); //This is an instance method.
//All you need to do is:
var stream = [];
stream = VideoStream({param: 'streamTypes'}).query();
来自https://docs.angularjs.org/api/ngResource/service/$resource:
$资源returns:
A resource "class" object with methods for the default set of resource actions optionally extended with custom actions. The default set contains these actions:
{ 'get': {method:'GET'}, 'save': {method:'POST'}, 'query': {method:'GET', isArray:true}, 'remove': {method:'DELETE'}, 'delete': {method:'DELETE'} };
Calling these methods invoke an $http with the specified http method, destination and parameters. When the data is returned from the server then the object is an instance of the resource class. The actions save, remove and delete are available on it as methods with the $ prefix
除了Wawy's answer, according to the docs here:
The action methods on the class object or instance object can be invoked with the following parameters:
- HTTP GET "class" actions: Resource.action([parameters], [success], error])
- non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
- non-GET instance actions: instance.$action([parameters], [success], [error])
查看控制器中VideoStream
的值,我们发现:
function Resource(value) {
shallowClearAndCopy(value || {}, this);
} // Actual Resource class object with regular action(s) we can work with
有
呼叫 VideoStream({param: 'streamTypes'})
returns:
undefined // Cannot call anything of undefined
和new VideoStream({param:'streamTypes'})
returns:
Resource {param: "streamTypes"}
// Instance of the Resource class (an object) where $action(s) are available
// Verified in the chrome console
考虑到这一点,案例应该是:
var stream = [];
stream = VideoStream.query({param: 'streamTypes'});