错误 - AngularJS 服务与 GET JSON 文件

Bug - AngularJS Service with GET JSON file

我正在开发一个简单的示例 AngularJS 应用程序,它从外部 JSON 数据文件中读取数据。我已经尝试了所有方法,但找不到应用程序无法运行的原因。任何输入将不胜感激。

'filmCtrl'控制:

angular
    .module('mediaApp')
    .controller('filmCtrl', function(filmList) {
        var vm = this;
        vm.films = filmList.retrieveFilms();
    });

'filmList' 服务:

angular
    .module('mediaApp')
    .service('filmList', function($http) {

        var vm = this;

        vm.retrieveFilms = function() {
            return $http
                .get('films.json')
                .then(function(response) {
                    return response.films;
                });
        };

        return vm;
    });

JSON:

{
    "films":[
        {
            "title": "Reservoir Dogs",
            "director": "Quentin Tarantino",
            "year": "1992"
        },
        {
            "title": "2001: A Space Odyssey",
            "director": "Stanley Kubrick",
            "year": "1967"
        },
        {
            "title": "Memento",
            "director": "Christopher Nolan",
            "year": "2000"
        },
        {
            "title": "Enter the Dragon",
            "director": "Robert Clouse",
            "year": "1973"
        },

         [etc]...
    ]
}

所有这些文件都保存在同一个文件夹中,并已包含在我的 HTML 文件中。 JSON 已经过验证。我哪里做错了?

  1. then(response) 中,响应 object 具有以下属性:

data – {string|Object} – 使用转换函数转换的响应 body。

status – {number} – 响应的 HTTP 状态代码。

headers – {function([headerName])} – Header getter 函数。

config – {Object} – 用于生成请求的配置 object。

statusText – {string} – 响应的 HTTP 状态文本。

所以这应该是

return $http
   .get('films.json')
   .then(function(response) {
      return response.data.films;
});

而不是

return $http
   .get('films.json')
   .then(function(response) {
      return response.films;
});

有关详细信息,请参阅 the official doc

  1. 如果您不是 运行 任何类型的网络服务器并且只是使用 file://films.json 进行测试,那么您可能 运行 进入 same-origin政策问题。参见:

http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy

一些错误信息可能有用。

根据我的意见,您可以像这样创建 service -

mediaApp.service('filmList', ['$http',
function($http) {
    var vm = this;
    vm.retrieveFilms = function() {
        return $http.get('data.json');
    };
    return vm;
}]);

controller 中,您可以像 -

一样消费这个 service
mediaApp.controller('filmCtrl', function(filmList) {
    var vm = this;
    filmList.retrieveFilms().then(function(response) {
        vm.films =response.data.films;
    });
});

工作计划 - http://plnkr.co/edit/6RVlvdh8oG5WaiEHaPdM?p=preview

它将在 FF 中工作,但对于某些浏览器,它会抛出 CORS 错误,因此在服务器上 运行 更好。