AngularJS 1.2.7 IE8 resource bug

813 Views Asked by At

Sample code available here & here. Since Plunker doesn't support IE8 or IE9 very well, the example code can be run by opening the Plunker example in a modern web browser and then launching the Run pane in a separate window and opening that URL in IE8 or IE9.

When making a RESTful call using $resource.query or $resource.get, the promise fails to return any results on IE8 or IE9 if a custom action is defined and used:

factory('ResourceService2', ['$resource', '$q', function($resource, $q) {
    var factory = {
        query: function() {
            var deferred = $q.defer();

            $resource('data.json', {'cacheSlayer' : new Date().getTime()}, {
                'query': { 
                    method: 'GET', 
                    responseType: 'json',
                    isArray: true
            }}).query(function (data) {
                deferred.resolve(data);
            });

            return deferred.promise;
        }
    };
    return factory;
}]).

query():

ResourceService2.query().then(function (response) {
    $scope.resource2Rows = response;
});

However, this same call successfully returns results when a custom action is not defined or used:

factory('ResourceService', ['$resource', '$q', function($resource, $q) {
    var factory = {
        query: function() {
            var deferred = $q.defer();

            $resource('data.json', {
                'cacheSlayer' : new Date().getTime()
            }, {}).query(function (data) {
                deferred.resolve(data);
            });

            return deferred.promise;
        }
    };
    return factory;
}]).

query():

ResourceService.query().then(function (response) {
    $scope.resourceRows = response;
});

Using $http is also successful:

factory('HttpService', ['$http', '$q', function($http, $q) {
    var factory = {
        query: function() {
            var deferred = $q.defer();

            $http.get('data.json', {
                params: {
                    'cacheSlayer' : new Date().getTime()
            }}).success(function (data) {
                deferred.resolve(data);
            });

            return deferred.promise;
        }
    };
    return factory;
}]).

get():

HttpService.query().then(function (response) {
    $scope.httpRows = response;
});

Is this a bug in IE8/IE9? What additional parameters for a custom action must be defined for IE8/IE9 compatibility? The Angular Developer's Guide makes no mention of this problem as of 1.2.7.

1

There are 1 best solutions below

1
On

CORS is not implemented fully in ie8/9 so this is most likely your issue. Here is the msdn article about it:

http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx