angularjs – 在Angular.js中进行AJAX调用的最佳做法是什么?

我正在读这篇文章http://eviltrout.com/2013/06/15/ember-vs-angular.html

它说,

Due to it’s lack of conventions,I wonder how many Angular projects
rely on bad practices such as AJAX calls directly within controllers?
Due to dependency injection,are developers injecting router
parameters into directives? Are novice AngularJS developers going to
structure their code in a way that an experienced AngularJS developer
believes is idiomatic?

我实际上是从我的Angular.js控制器进行$ http调用。为什么这是一个坏的做法?那么,最好的做法是使用$ http调用呢?为什么?

编辑:这个答案主要集中在版本1.0.X.为了防止混乱,它被改变以反映当今版本的Angular的最佳答案,截至今天,2013-12-05。

想法是创建一个服务,返回一个promise返回的数据,然后调用它在你的控制器,并处理承诺,填充你的$ scope属性

服务

module.factory('myService',function($http) {
   return {
        getFoos: function() {
             //return the promise directly.
             return $http.get('/foos')
                       .then(function(result) {
                            //resolve the promise as the data
                            return result.data;
                        });
        }
   }
});

控制器:

处理promise的then()方法并从中获取数据。设置$ scope属性,并做任何你可能需要做的事情。

module.controller('MyCtrl',function($scope,myService) {
    myService.getFoos().then(function(foos) {
        $scope.foos = foos;
    });
});

视图内容承诺分辨率(仅限1.0.X):

在Angular 1.0.X中,这个原始答案的目标,promise会得到View的特殊处理。当它们解析时,它们的解析值将绑定到视图。这在1.2.X中已被弃用

module.controller('MyCtrl',myService) {
    // now you can just call it and stick it in a $scope property.
    // it will update the view when it resolves.
    $scope.foos = myService.getFoos();
});

相关文章

AngularJS 是一个JavaScript 框架。它可通过 注:建议把脚本放在 元素的底部。这会提高网页加载速度,因...
angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题。出现这个的原因是:由于...
AngularJS 通过被称为指令的新属性来扩展 HTML。AngularJS 指令AngularJS 指令是扩展的 HTML 属性,带有...
AngularJS 使用表达式把数据绑定到 HTML。AngularJS 表达式AngularJS 表达式写在双大括号内:{{ expres...
ng-repeat 指令可以完美的显示表格。在表格中显示数据 {{ x.Name }} {{ x.Country }} 使用 CSS 样式为了...
$http是 AngularJS 中的一个核心服务,用于读取远程服务器的数据。读取 JSON 文件下是存储在web服务器上...