我们在上一课做了很多基础性的训练,接下来,我们讲一些难点的知识点,首先,讲一下如何实现一个全文检索功能:

<html ng-app>
<head>
...
<script src="lib/angular/angular.js"></script>
<script>
  function PhoneListCtrl($scope) {
    $scope.phones = [
    {"name": "Nexus S","snippet": "Fast just got faster with Nexus S."},
    {"name": "Motorola XOOM™ with Wi-Fi","snippet": "The Next, Next Generation tablet."},
    {"name": "MOTOROLA XOOM™", "snippet": "The Next, Next Generation tablet."}
    ];
  }
 </script>
</head>
<body ng-controller="PhoneListCtrl"> <div class="container-fluid">
  <div class="row-fluid">
  <div class="span2">   Search: <input ng-model="query">   </div>
  <div class="span10">   <ul class="phones">
  <li ng-repeat="phone in phones | filter:query">
    {{phone.name}}
    <p>{{phone.snippet}}</p>
  </li>
  </ul> </div>
  </div>
  </div>
</body>
</html>

上面这个代码的功能:允许用户输入一个搜索条件,立刻就能看到电话列表中的搜索结果。

当页面加载后,AngularJS会根据输入框中的值,将其与数据模型中相同名字的变量($scope.query)绑定在一起,以确保两者的同步性。

在这段代码中,用户在输入框中输入的值称作query,会立刻作为列表迭代器(phone in phones | filter:query`)其过滤器的输入。

使用filter过滤器:filter函数使用query的值来创建一个只包含匹配query记录的新数组。

ngRepeat会根据filter过滤器生成的手机记录数据数组来自动更新视图。整个过程对于开发者来说都是透明的。

接下来,我们将在上面的例子中添加一个新的功能:增加一个让用户控制手机列表显示顺序的功能

Search: <input ng-model="query">
Sort by:
<select ng-model="orderProp">
<option value="name">Alphabetical</option>
<option value="age">Newest</option>
</select> <ul class="phones">
<li ng-repeat="phone in phones | filter:query | orderBy:orderProp">
{{phone.name}}
<p>{{phone.snippet}}</p>
</li>
</ul>

我们在html中做了如下更改:

  • 首先,我们增加了一个叫做orderProp<select>标签,这样我们的用户就可以选择我们提供的两种排序方法。
  • 然后,在filter过滤器后面添加一个orderBy过滤器用其来处理进入迭代器的数据。orderBy过滤器以一个数组作为输入,复制一份副本,然后把副本重排序再输出到迭代器。

AngularJS在select元素和orderProp模型之间创建了一个双向绑定。而且orderProp会被用作orderBy过滤器的输入。

无论什么时候数据模型发生了改变(比如用户在下拉菜单中选了不同的选项),AngularJS的数据绑定会让视图自动更新。没有任何笨拙的DOM操作!

function PhoneListCtrl($scope) {
$scope.phones = [
{"name": "Nexus S",
"snippet": "Fast just got faster with Nexus S.",
"age": 0},
{"name": "Motorola XOOM™ with Wi-Fi",
"snippet": "The Next, Next Generation tablet.",
"age": 1},
{"name": "MOTOROLA XOOM™",
"snippet": "The Next, Next Generation tablet.",
"age": 2}
]; $scope.orderProp = 'age';
}
  • 我们修改了phones模型—— 手机列表的数组 ——为每一个手机记录增加了一个age属性。我们会根据age属性来对手机列表进行排序。
  • 我们在控制器代码里加了一行orderProp的默认值为age。如果我们不设置默认值,这个模型会在我们的用户在下拉菜单选择一个顺序之前一直处于未初始化状态。

当应用在浏览器中加载时,“Newest”在下拉菜单中被选中。这是因为我们在控制器中我们把orderProp设置成了‘age’。所以绑定,从模型到用户界面的方向上起了作用——即数据从模型到视图的绑定。现在当你在下拉菜单中选择“Alphabetically”,数据模型会被同时更新,并且手机列表数组会被重新排序。这个时候数据绑定从另一个方向产生了作用——即数据从视图到模型的绑定。

最后,通过一幅图来看一下这个例子的M和V是如何分离的:

看了这个例子,大家是否觉得使用angular进行开发,是不是很方便啊。它封装了事件绑定,DOM操作,模板解析等操作,大大的减少了开发任务。

加油!

最新文章

  1. 复习(2)【postman,charles,filezilla server】
  2. Entity Framework Core 1.1 Preview 1 简介
  3. 搭建TFS 2015 Build Agent环境(二)
  4. jquery-创建弹出框原理
  5. go sync.Mutex 设计思想与演化过程 (一)
  6. abstract class和interface有什么区别?
  7. iOS 学习资料整理
  8. List Comprehensions
  9. MYSQL数据库性能调优之三:explain分析慢查询
  10. shell脚本分为三类:登录脚本、交互式脚本、非交互式脚本
  11. Demo学习: CustomException
  12. Arduino 各种模块篇 蓝牙模块 手机蓝牙控制Arduino LED灯
  13. javascript string对象方法总结
  14. JAVA程序员成长历程(二)
  15. Spring ES
  16. 解读经典《C#高级编程》泛型 页114-122.章4
  17. WC2019 游记
  18. Atitit 酷奇的押金危机 遇到资金链断裂作为创始人应该怎么办
  19. 离线部署 Cloudera Manager 5 和 CDH 5.12.1 及使用 CDH 部署 Hadoop 集群服务
  20. 树的遍历算法-只有一个变量T-递归和非递归

热门文章

  1. gain 基尼系数
  2. kubelet disk 压力
  3. Kubernetes集群向指定节点上创建容器
  4. Mysql,重复字段只取其中一行
  5. ios 7.1企业证书无线安装
  6. 8-@Pointcut( &quot;execution(* com.ctgu.controller.AccountController.transfer(..))&quot; ) 拦截配置问题
  7. js输出/获得Cookie
  8. 如何设计Kafka?
  9. PKUWC2019 真&#183;游记
  10. Zookeeper 源码(四)Zookeeper 服务端源码