学习AngularJS入门教程, 英文版

1 01和02,静态模板和AngularJS模板

在HTML里面用np-app来定义Angular的上下文,可以用 ng-app="AAA" 来制定一个名字空间.JS中 通过这个名字来获取HTML里的上下文 var AAA = angular.module('AAA', []);.

在HTML中Angular的范围内,用 ng-controller="BBB"标记一个div,在里 面用一些Angular命令(ng-repeat)和表达式设定显示方式.在JS里面用 AAA.controller('BBB',function ...) 给Angular表达式中的域赋值.

AAA 中的 $scope$ 是AAA的根作用域,控制器的作用域则在 BBB 之中.也 就是说,如果在AAA下面有多个 controller, controller X 的数据绑定 在 controller Y 下是无效的. AngularJS作用域文档.

略:AngularJS的开发者倾向于使用 Jasmine 行为驱动开发(BBD)框架进行 测试.

写在后面,对angular.module是所有JS中创建,注册和获取模组的地方.HTML里 面通过ng-app=”AA”来绑定模组AA的上下文

2 03 迭代器

建立输入表单 <input ng-model="query"> ,修改 ng-repeat<li ng-repeat="x in list|filter:query">.只要在输入框里输入文本,就会自动 地修改列表,只显示包含这个文本的项目.这代表两点:1. 数据绑定同名变量 query,值的同步是实时的; 2.filter过滤器,生成新数组,自动更新视图.

略:Angular端到端测试.

3 04双向绑定

在HTML里面添加选择器

<select ng-model="orderProp">
  <option value="name">Alphabetical</option>
  <option value="age">Newest</option>
</select>

同时在迭代器中加入条件 <li ng-repeat="phone in phones | filter:query | orderBy:orderProp">

JS中给每个数据加上 age 这个属性,同时设定 $scope.orderProp = 'age'设定选择器 的默认值.

select 的元素和 orderProp 之间建立了双向绑定.

4 05XHR和依赖注入

通过 $http.get(AA/BB.json) 来读取json文件. $http 是AngularJS提 供的内建服务,通过依赖注入DI子系统.

phonecatApp.controller('PhoneListCtrl', ['$scope', '$http', function($scope, $http) {
    $http.get('phones/phones.json').success(function(data) {
        $scope.phones = data;
    });
}]);

5 06链接与图片模板

<ul class="phones">
  <li ng-repeat="phone in phones | filter:query | orderBy:orderProp" class="thumbnail">
    <a href="#/phones/" class="thumb"><img ng-src=""></a>
    <a href="#/phones/"></a>
    <p></p>
  </li>
</ul>

6 07路由与多视图 & 08更多模板

$routeProvider 重定向url,把某个url路径定向到某个HTML模板上去, 并指定相对应的controller. index.html 中定义一个域,加载所有JS文件.加 载的 app.js 设定重定向规则.

phonecatApp.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/phones', {
        templateUrl: 'partials/phone-list.html',
        controller: 'PhoneListCtrl'
      }).
      when('/phones/:phoneId', {
        templateUrl: 'partials/phone-detail.html',
        controller: 'PhoneDetailCtrl'
      }).
      otherwise({
        redirectTo: '/phones'
      });
  }]);

:phoneId 是从将URL路径的对应部分作为变量.这个变量通过 $routeParams 来访问.

最后,在index.html里面加上 <div ng-view></div> 来为当前路由把对应 视图加上去.

08更多模板 之中用 $http 加载不同的json文件来根据phoneId生成每 部手机的细节说明网页.

7 09过滤器

建立自己的 filter FF,实现更复杂的规则,然后像之前使用 | filter:query 一样用类似pipe的语法把输出传给自己的filter | FF.filter并不限定在 ng-repeat 中使用.

angular.module('phonecatFilters', []).filter('checkmark', function() {return function(input) {
    return input ? '\u2713' : '\u2718';
  };
});

AngularJS内置过滤器 uppercase, json, date, date:”MM/dd/yyy@ h:mma”.

8 10事件

通过JS在上下文中定义函数,通过 ng-click 来设定点击事件,调用函数.

phonecatControllers.controller('PhoneDetailCtrl', ['$scope', '$routeParams', '$http',
  function($scope, $routeParams, $http) {
    $http.get('phones/' + $routeParams.phoneId + '.json').success(function(data) {
      $scope.phone = data;
      $scope.mainImageUrl = data.images[0];
    });

    $scope.setImage = function(imageUrl) {
      $scope.mainImageUrl = imageUrl;
    }
  }]);

$scope.setImage 就是绑定的函数.

<img ng-src="" class="phone">

...

<ul class="phone-thumbs">
  <li ng-repeat="img in phone.images">
    <img ng-src="" ng-click="setImage(img)">
  </li>
</ul>

点击图片的时候调用函数,把 mainImageUrl 的值设定为当前图片.

9 11Rest和定制服务

依赖为 angular-resource/angular-resource.js.一般我们的JS相应功能 命名为 XXXService.首先注册 Service 模块.

var phonecatServices = angular.module('phonecatServices', ['ngResource']);

phonecatServices.factory('Phone', ['$resource',
  function($resource){
    return $resource('phones/:phoneId.json', {}, {
      query: {method:'GET', params:{phoneId:'phones'}, isArray:true}
    });
  }]);

建立一个 Phone 工厂,用 $resource 来取得数据.相应的controller改 为$scope.phone = Phone.get({phoneId:$routeParams.phoneId})$scope.phones = Phone.query().

query 方法是自己声明和定义的 query: {method:'GET', params:{phoneId:'phones'}, isArray:true}.

10 12 Animations

TODO

更多的教程 开发指南Cookbook. 推荐使用AngularJS种子项目来引导开发新项目