`

AngularJS Team List应用:过滤器和控制器的交互

阅读更多

        在这个例子中,我们将会通过实例展示如下两个主要的方面:

1.如何以一种优雅、简洁的方式把过滤器和迭代器联合起来使用?

2.如何使没有继承关系的控制器进行交互

        应用本身很简单,其中的数据是关于各种体育运动的团队列表,例如篮球、足球(是美式足球,不是英式足球)和曲棍球。对于每一个团队,都有队名、城市、运行名称,以及该团队是否是推荐团队这几个字段。

        我们需要在屏幕上显示这个团队列表,同时在左侧显示一个过滤器,当过滤规则被修改时,列表会立即刷新。我们打算使用两个控制器,一个用来存储数据,另一个和过滤器配合使用。另外,我们打算使用一个服务,它负责ListCtrl和FilterCtrl之间的交互。

        先来看看这个服务,整个应用将会由它来驱动。

service.js

angular.module('myApp.services', []).
 factory('filterService', function() {
	 return {
		 activeFilters: {},
		 serchText:''
	 };
 });

        AngularJS服务都是单例的(它是带有小写"s"的单例,也就是作用域中的单例,而不是全局可见或者全局可访问的单例)。当我们声明filterService的时候,就已经保证了在整个应用中filterService的实例只有一个。

        我们最终让filterService成为了FilterCtrl和ListCtrl之间的交互通道,因为这两个控制器可以都绑定在它上面,并且当FilterService发生更新的时候,两控制器可以访问其中的东西。这两个控制器都极其简单,因为它们基本上什么都不做,只是简单地进行赋值操作。

controller.js

var app = angular.module('myApp', ['myApp.services']);

app.controller('ListCtrl', function($scope, filterService) {
	$scope.filterService = filterService;
	$scope.teamsList = [
    	{id:1,name:'Dalls Mavericks',sport:'Basketball',city:'Dallas',featured:true},
    	{id:2,name:'Dalls Cowboys',sport:'Football',city:'Dallas',featured:false},
    	{id:3,name:'New York Knicks',sport:'Basketball',city:'New York',featured:false},
    	{id:4,name:'Brooklyn Nets',sport:'Basketball',city:'New York',featured:false},
    	{id:5,name:'New York Jets',sport:'Football',city:'New York',featured:false},
    	{id:6,name:'New York Giants',sport:'Football',city:'New York',featured:true},
    	{id:7,name:'Los Angeles Lakers',sport:'Basketball',city:'Los Angeles',featured:true},
    	{id:8,name:'Los Angeles Clippers',sport:'Basketball',city:'Los Angeles',featured:false},
    	{id:9,name:'Dallas Stars',sport:'Hockey',city:'Dallas',featured:false},
    	{id:10,name:'Boston Bruins',sport:'Hockey',city:'Boston',featured:true}
	];
});

app.controller('FilterCtrl', function($scope, filterService) {
	$scope.filterService = filterService;
});

List.html

<!DOCTYPE html>
<html ng-app="myApp">

<head lang="en">
	<meta charset="utf-8"></meta>
	<title>Teams List App</title>
	<script src="jquery/jquery-1.8.3.js"></script>
	<script src="angular/angular.js"></script>
	<link rel="stylesheet" href="bootstrap/bootstrap.css"></link>
	<script src="bootstrap/bootstrap.js"></script>
	
	<script src="service.js"></script>
	<script src="controller.js"></script>
</head>

<body>
	<div class="row-fluid">
		<div class="span3" ng-controller="FilterCtrl">
			<form class="form-horizontal">
				<div class="controls-row">
					<label for="searchTextBox" class="control-label">Search:</label>
					<div class="controls">
						<input type="text" id="searchTextBox" ng-model="filterService.searchText"></input>
					</div>
				</div>
				
				<div class="controls-row">
					<label for="sportComboBox" class="control-label">Sports:</label>
					<div class="controls">
						<select id="sportComboBox" ng-model="filterService.activeFilters.sport" ng-options="sport for sport in ['Basketball', 'Hockey', 'Football']">
						</select>
					</div>
				</div>
				
				<div class="controls-row">
					<label for="cityComboBox" class="control-label">City:</label>
					<div class="controls">
						<select id="cityComboBox" ng-model="filterService.activeFilters.city" ng-options="city for city in ['Dallas', 'Los Angeles', 'Boston', 'New York']">
						</select>
					</div>
				</div>
				
				<div class="controls-row">
					<label class="control-label">Featured:</label>
					<div class="controls">
						<input type="checkbox" ng-model="filterService.activeFilters.featured" ng-false-value="" />
					</div>
				</div>
			</form>
		</div>
		<div class="offset1 span8" ng-controller="ListCtrl">
			<table>
				<thead>
					<tr>
						<th>Name</th>
						<th>Sport</th>
						<th>City</th>
						<th>Featured</th>
					</tr>
				</thead>
				<tbody id="teamListTable">
					<tr ng-repeat="team in teamsList | filter:filterService.activeFilters | filter:filterService.searchText">
						<td>{{team.name}}</td>
						<td>{{team.sport}}</td>
						<td>{{team.city}}</td>
						<td>{{team.featured}}</td>
					</tr>
				</tbody>
			</table>
			<br>
			<div>
				<span>过滤器对象activeFilters:{{filterService.activeFilters}}</span>
			</div>
		</div>
	</div>
</body>	
</html>

        如上HTML模板中,复选框绑定在filterService.activeFilters.featured属性上。需要注意的是,当featured被选中时,我们只想把那些featured=true的团队显示出来。当它被反选时,我们需要把那些featured=true和featured=false的团队都显示出来。为了实现这一点,我们使用ng-false-value=""指令,用来说明当复选框被反选时需要清除featured过滤器的效果。

       我们再来看一下ng-repeat这段代码:

"team in teamsList | filter:filterService.activeFilters | filter:filterService.searchText"

        第一部分和平常一样,不同之处在于后面两个新的过滤器。第一个过滤器告诉AngularJS使用filterService.activeFilters来过滤数据列表。基本的处理方法是:获取被过滤对象上的每一个属性,并保证迭代器中的每一个对象都与过滤器中对应的属性相匹配。所以,如果acitveFilters[city]=Dallas,那么只有过滤器中满足city=Dallas的对象才会被选中。如果存在多个过滤器,那么所有过滤器都必须进行匹配。第二个过滤器是一个文本匹配过滤器。它的基本处理方式是:如果对象的所有取值中存在与filterService.searchText相等的值,则选中该对象。所以,它会在cities、teamnames、sports以及featured所有这些属性上进行匹配。

运行效果:



 

  • 大小: 42.6 KB
  • 大小: 24.7 KB
  • 大小: 26.3 KB
分享到:
评论

相关推荐

    SE-Project-Team1:网络摄像头鼠标控制器

    综上所述,“SE-Project-Team1:网络摄像头鼠标控制器”通过Python和OpenCV实现了创新的人机交互方式。该项目不仅展示了Python在计算机视觉领域的强大功能,也为未来的交互式应用开发提供了灵感。通过深入学习和实践...

    chef-teamcity:TeamCity厨师食谱

    平台类德比安的Ubuntu 经过测试: Ubuntu 13.04菜谱teamcity::default安装PostgreSQL,TeamCity服务器和代理teamcity::monit安装monit并将其配置为监视服务器和代理用法将recipe[teamcity]添加到您的运行列表。...

    Laravel开发-teamwork

    在Laravel应用中,这个包装器可以被用于创建自定义的后台管理界面或者命令行工具,以便于团队成员更便捷地管理和查看Teamwork中的项目数据。例如,你可以创建一个Artisan命令来批量导入任务,或者通过中间件来自动...

    v26-geckos-team-04::shopping_cart:亚马逊克隆购物应用:shopping_cart:

    npm test 在交互式监视模式下启动测试运行器。 有关更多信息,请参见关于的部分。npm run build 构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。 生成被最小化,并且...

    MS3-Team-2:MEAN堆栈开发类小组项目

    - **客户端**:可能有`public`或`client`目录,其中包含AngularJS应用的所有前端资源,如HTML模板、CSS样式、JavaScript文件(可能包括AngularJS模块、服务、控制器等)。 - **配置文件**:可能包括数据库连接配置...

    IOS自定义弹框公告+时间锁+跳转官网+锁库名+证书到期日期 动态库(dylib)

    v-team-cert:是否显示开发者证书到期时间【开启参数:true,其他参数一律关闭(如果开启了,到期时间会追加在你的弹框内容底部)】 如需动态库改名请联系作者QQ:1276117137 未经允许,擅自更改动态库库名,...

    team-todo:团队的实时TODO应用程序

    在这个实时TODO应用中,JavaScript负责处理用户交互、数据管理和网络通信。以下是一些关键知识点: 1. **事件驱动编程**:JavaScript采用事件驱动模型,用户操作如点击按钮或输入数据都会触发特定的事件,应用根据...

    team-compass:用于在整个JupyterHub生态系统中进行团队交互,同步和处理会议记录的存储库

    Team-Compass 是一个专门为 JupyterHub 生态系统设计的工具,旨在促进团队间的交互、同步和会议记录管理。这个存储库提供了一个高效的工作流程,使得在 JupyterHub 环境下进行项目管理和协作变得更加便捷。 **...

    Team7DWebApp:格拉斯哥大学团体项目的Web应用程序

    【Team7DWebApp:格拉斯哥大学团体项目的Web应用程序】 Team7DWebApp是一个由格拉斯哥大学团队开发的Web应用程序项目。这个项目旨在提供一个互动和协作的平台,可能用于教学、研究或者学生团队合作。Web应用程序是...

    TEAM_WILD:团队 GoWild!:trade_mark: 的 Android 银行应用程序

    1. **Activity和Fragment**:Android应用的基本组件,用于处理用户界面和交互。 2. **Intent**:Android中用于启动服务、启动新Activity或传递数据的机制。 3. **布局管理器**:如LinearLayout、RelativeLayout、...

    Team3:使用Swift Team 3项目进行App开发-源码

    在Swift编程语言中,Team3项目...在Team3项目中,开发者将有机会深入理解和应用这些Swift编程和iOS开发的关键概念,逐步构建出功能完善的App。通过实际操作,不仅可以提升编程技能,还能培养解决问题和团队协作的能力。

    STM32L152 USB HID的一个例子,使用内部晶体

    USB HID类是一种通信协议,用于设备与主机之间直接进行人机交互,例如键盘、鼠标和游戏控制器等。STM32L152集成了USB 2.0全速接口,支持HID类设备,使得它成为开发此类应用的理想选择。 首先,我们需要理解STM32L1...

    Team_Admin:工作团队

    4. **协作工具**:高效的团队协作工具,如即时通讯、文档共享、评论和版本控制等功能,可能是Team_Admin的一部分。这些工具可以帮助团队成员在不同地点和时间同步工作,提高工作效率。 5. **资源管理**:团队可能...

    Team-Medpal:I4G团队MedPal项目

    CSS(层叠样式表)用于控制网页外观,而JavaScript则提供动态功能,如表单验证、数据交互和动画效果。 综上所述,HTML在Team-Medpal:I4G团队的MedPal项目中扮演着构建用户界面和交互体验的核心角色,通过合理利用...

    team-generator:团队生成器命令行应用程序

    团队生成器描述: 这是一个命令行应用程序(CLI),用于基于用户对有关经理和团队成员的问题的响应来生成带有团队信息HTML网页。目录安装有一些npm模块是必需的。 查询器(用于提示),fs(用于文件编写),粉笔...

    team3HTML:Team3

    在这个目录下,我们可能会找到HTML文件(如index.html,用于网页的主入口),CSS文件(用于样式设计,如style.css),JavaScript文件(用于交互和动态功能,如script.js),以及可能的图像、图标和其他辅助资源。...

    Request-Reviewer-For-Team-Action:根据公关作者或作者团队为人或团队分配评论

    这属于.github/request-review-for-team.yml : when: - author: # At least one of the following matches... nameIs: - Author1 - Author2 teamIs: - Team1 - Team2 assign: teams: - ReviewTeam1 -...

    Team-Yoda:一个连接PPE驱动器和医院诊所的Web应用程序

    "Team-Yoda"是一个旨在连接个人防护装备(PPE)捐赠者与医院和诊所的Web应用程序。这个项目的核心目标是优化资源分配,确保在医疗领域前线工作的人员能够得到必要的保护装备,尤其是在面对如COVID-19这样的公共卫生...

Global site tag (gtag.js) - Google Analytics