diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js index 99eba72e6f15..dd6062e6b215 100644 --- a/src/ngResource/resource.js +++ b/src/ngResource/resource.js @@ -580,7 +580,14 @@ angular.module('ngResource', ['ng']). if (action.isArray) { value.length = 0; forEach(data, function (item) { - value.push(new Resource(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); diff --git a/test/ngResource/resourceSpec.js b/test/ngResource/resourceSpec.js index 88a9c5dd6b1a..6e58976355bd 100644 --- a/test/ngResource/resourceSpec.js +++ b/test/ngResource/resourceSpec.js @@ -1113,6 +1113,27 @@ describe("resource", function() { $httpBackend.flush(); expect(user).toEqualData([ {id: 1, name: 'user1'} ]); }); + + it('should not convert string literals in array into Resource objects', function() { + $httpBackend.expect('GET', '/names.json').respond(["mary", "jane"]); + var strings = $resource('/names.json').query(); + $httpBackend.flush(); + expect(strings).toEqualData(["mary", "jane"]); + }); + + it('should not convert number literals in array into Resource objects', function() { + $httpBackend.expect('GET', '/names.json').respond([213, 456]); + var numbers = $resource('/names.json').query(); + $httpBackend.flush(); + expect(numbers).toEqualData([213, 456]); + }); + + it('should not convert boolean literals in array into Resource objects', function() { + $httpBackend.expect('GET', '/names.json').respond([true, false]); + var bools = $resource('/names.json').query(); + $httpBackend.flush(); + expect(bools).toEqualData([true, false]); + }); }); describe('get', function(){