最简单的例子
example
1 2 3 4
| <body ng-app="app"> <p><input ng-model="text"></p> <p>input: {{text}}</p> </body>
|
1
| angular.module('app', []);
|
ng-app
ng 脚本的作用域
data-binding
数据模型
{{model}}
用于数据展示
ng-model
实现的是数据的双向绑定
稍微有点功能
example
1 2 3 4
| <body ng-controller="Ctrl"> <p><input ng-model="text"></p> <p><button ng-click="showMe()">Show Me</button></p> </body>
|
1 2 3 4 5 6 7
| angular.module('app', []) .controller('Ctrl', function ($scope) { $scope.text = 'hello!'; $scope.showMe = function () { alert($scope.text); }; });
|
controller
控制器,操作 ng-controller
。
$scope
可以认为就是上面那个被操作的 controller 的作用域
迭代器
example
1 2 3 4 5 6
| <ul> <li ng-repeat="item in list"> <span item="{{age}}">{{item.name}}</span> <span class="gray">{{item.carrier}}</span> </li> </ul>
|
1 2 3 4 5
| $scope.list = [{ age: 2, carrier: 'AT&T', name: 'MOTOROLA ATRIX\u2122 4G' }, ...];
|
依赖注入
example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| angular.module('app', []) .service('DataService', function () { var data = [{ age: 2, carrier: 'AT&T', name: 'MOTOROLA ATRIX\u2122 4G' }, ...]; return { all: function() { return data; } }; }) .controller('Ctrl', function ($scope, DataService) { $scope.list = DataService.all(); });
|
注意到 service
里的 DataService
是我们自定义的,但在下面的 controller
中却可以直接使用。这个是 ng 过控制器构造函数的参数名字来推断依赖服务名称。
更好理解的方式
1 2 3 4 5 6 7 8 9 10 11
| angular.module('app', []) .service('DataService', function () { }) .controller('Ctrl', [ '$scope', 'DataService', function ($scope, DataService) { } ]);
|
controller
传入数组:数组最后一个元素是 controller
的构造函数,前面的元素是需要注入到这个 controller
的服务。
这样也同时解决了压缩代码时变量名混淆的问题。
还有一种 Ctrl.$inject = ['$scope', 'DataService'];
的形式,但个人不太喜欢。
Directive
example
1 2 3 4 5 6 7
| <body ng-controller="Ctrl"> <p>First Directive</p> <list></list>
<p>Second Directive</p> <list></list> </body>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| angular.module('app', []) .service('DataService', function () { }) .controller('Ctrl', angular.noop) .directive('list', function (DataService) { return { restrict: 'E', templateUrl: 'tpl/list.html', link: function ($scope) { $scope.list = DataService.all(); } }; });
|
restrict
官网解释
The restrict option is typically set to:
'A'
- only matches attribute name
'E'
- only matches element name
'C'
- only matches class name
These restrictions can all be combined as needed:
'AEC'
- matches either attribute or element or class name
link vs controller
网上有好多讨论,大致意思是:
link
做的是数据、事件绑定、dom 修改一类的操作(在 dom 渲染后)
controller
主要做业务逻辑,directive 之间的通信(官网有例子)
$scope
没有指定的情况下,$scope
指向的是所在的 controller 的作用域。因此上面的例子中的 $scope
是同一个!若有任何操作,两边是同步的。
可以通过下面的方式指定 scope
。
1 2 3 4 5 6 7 8 9 10 11
| app.directive('list', function (DataService) { return { restrict: 'E', scope: {}, templateUrl: 'tpl/list-2.html', link: function ($scope) { console.log($scope.list); $scope.list = DataService.all(); } }; });
|
$element
- 封装了简单的 jQuery 操作
- 可配合 jQuery 使用
attrs
当前 directive 的 attributes
Filters
example
1 2 3 4 5 6 7
| <input type="text" placeholder="Search" ng-model="search.$"> <ul class="a"> <li ng-repeat="item in list | filter:search:strict"> <span item="{{age}}">{{item.name}}</span> <span class="gray">{{item.carrier}}</span> </li> </ul>
|
自定义
1
| <span>{{num | fixedTwo}}</span>
|
1 2 3 4 5 6 7 8 9
| app.filter('fixedTwo', function () { return function (input) { try { return input.toFixed(2); } catch (e) { return input; } }; });
|
Module
example
1 2 3 4 5 6 7 8 9 10
| angular.module('util', []) .service('DataService', function ($http) { }) .controller('UtilCtrl', angular.noop) .directive('list', function (DataService) { });
angular.module('app', ['util']);
|
这里模块 app
引用了模块 util
,因此可以使用其中的指令 list
。
Route
example
使用插件 angular-route
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| angular.module('app', ['ngRoute', 'util']) .config(function($routeProvider) { $routeProvider.when('/home', { templateUrl: 'tpl/home.html', controller: 'HomeCtrl' }) .when('/detail', { templateUrl: 'tpl/detail.html', controller: 'DetailCtrl' }) .otherwise({ redirectTo: '/home' }); }) .controller('HomeCtrl', function ($scope) { $scope.id = 'Home'; }) .controller('DetailCtrl', function ($scope) { $scope.name = 'Detail'; });
|
一些链接