AngularJs的UI组件ui-Bootstrap分享(十一)——Typeahead

Typeahead指令是一个用于智能提示或自动完成的控件,就像Jquery的AutoComplete控件一样。来看一个最简单的例子:

 1 <!DOCTYPE html>
 2 <html ng-app="ui.bootstrap.demo" xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <link href="/Content/bootstrap.css" rel="stylesheet" />
 6     <title></title>
 7
 8     <script src="/Scripts/angular.js"></script>
 9     <script src="/Scripts/ui-bootstrap-tpls-1.3.2.js"></script>
10     <script>
11
12         angular.module(‘ui.bootstrap.demo‘, [‘ui.bootstrap‘]).controller(‘TypeaheadCtrl‘, function ($scope) {
13             $scope.selected = undefined;
14             $scope.names = [
15                 { ‘name‘: ‘张三‘, ‘ename‘: ‘zhangsan‘ },
16                 { ‘name‘: ‘李四‘, ‘ename‘: ‘lisi‘ },
17                 { ‘name‘: ‘王五‘, ‘ename‘: ‘wangwu‘ }
18             ];
19         });
20     </script>
21
22 </head>
23 <body>
24     <div ng-controller="TypeaheadCtrl">
25         <input type="text" ng-model="selected" uib-typeahead="n.name as n.name+‘(‘+n.ename+‘)‘ for n in names | filter:$viewValue | limitTo:8" class="form-control">
26     </div>
27 </body>
28 </html>

在文本框中输入z,智能提示效果是:

选中后,文本框的值是:

uib-typeahead的用法和表单元素select中的表达式是一样的,可以分别指定显示的文本和选中的值。names用filter过滤器筛选输入的数据(按数组中每个元素的每个属性来过滤)。

uib-typeahead可以使用的属性有:

属性名 默认值 备注
ng-model   文本框的值
ng-model-options   设置ng-model的选项。支持debounce和getterSetter
typeahead-append-to null 指定智能提示的父元素
typeahead-append-to-body false 智能提示内容放在 $body中,而不是它的父元素中
typeahead-editable true 为true时文本框的值可以任意输入,为false时文本框的值只能从智能提示列表中选取
typeahead-focus-first true 智能提示列表中的第一个值是否获取焦点
typeahead-focus-on-select true 从智能提示列表中选中值后,文本框是否获取焦点
typeahead-input-formatter undefined 选取值后格式化文本框内容
typeahead-is-open angular.noop 绑定一个变量,表示智能提示列表是否展开
typeahead-loading angular.noop 绑定一个变量,表示匹配项是否异步获取
typeahead-min-length 1 触发智能提示的最小输入字符数。必须大于等于0
typeahead-no-results angular.noop 绑定一个变量,表示没有找到匹配项时的处理方式
typeahead-on-select($item, $model, $label, $event) null 从列表中选中值后的回调函数。如果选中动作不是用户触发的,$event则为undefined
typeahead-popup-template-url uib/template/typeahead/typeahead-popup.html  
typeahead-select-on-blur false 文本框失去焦点时,选中当前高亮的匹配项
typeahead-select-on-exact false 只有一个匹配项时自动选中
typeahead-show-hint false 输入内容的前半部分有匹配项时,是否提示后半部分
typeahead-template-url uib/template/typeahead/typeahead-match.html  
typeahead-wait-ms 0 输入字符后,等待多少毫秒触发智能提示

在下面这个例子中,数据的获取是从服务端异步获取的:

 1 <!DOCTYPE html>
 2 <html ng-app="ui.bootstrap.demo" xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <link href="/Content/bootstrap.css" rel="stylesheet" />
 6     <title></title>
 7
 8     <script src="/Scripts/angular.js"></script>
 9     <script src="/Scripts/ui-bootstrap-tpls-1.3.2.js"></script>
10     <script>
11
12         angular.module(‘ui.bootstrap.demo‘, [‘ui.bootstrap‘]).controller(‘TypeaheadCtrl‘, function ($scope, $http) {
13             $scope.selected = undefined;
14
15             $scope.getNames = function (val) {
16                return $http.get(‘/home/GetNames‘, {
17                     params: {
18                         name: val
19                     }
20                })
21                     //.success(function (data, status, config, headers) {
22                     //    return data;
23                     //});
24                    .then(function (response) {
25                         return response.data;
26                 });
27             };
28         });
29     </script>
30
31 </head>
32 <body>
33     <div ng-controller="TypeaheadCtrl">
34         <input type="text" ng-model="selected"  uib-typeahead="n.name for n in getNames($viewValue)" typeahead-loading="loadingLocations" typeahead-no-results="noResults" class="form-control">
35         <i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>
36         <div ng-show="noResults">
37             <i class="glyphicon glyphicon-remove"></i> No Results Found
38         </div>
39     </div>
40 </body>
41 </html>

需要注意的一点是:getNames()方法要返回一个promise,并且$http返回的promise要用.then()来处理,而不能用.success()来处理。此处有个疑问,既然.then()和.success()都是返回一个promise,为什么使用.success()时,智能提示列表无法获取到数据?

这是一个官方的例子,用来展示如何使用typeahead-template-url:

 1 <!DOCTYPE html>
 2 <html ng-app="ui.bootstrap.demo" xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <link href="/Content/bootstrap.css" rel="stylesheet" />
 6     <title></title>
 7
 8     <script src="/Scripts/angular.js"></script>
 9     <script src="/Scripts/ui-bootstrap-tpls-1.3.2.js"></script>
10     <script>
11
12         angular.module(‘ui.bootstrap.demo‘, [‘ui.bootstrap‘]).controller(‘TypeaheadCtrl‘, function ($scope, $http) {
13             $scope.selected = undefined;
14
15             $scope.statesWithFlags = [{ ‘name‘: ‘Alabama‘, ‘flag‘: ‘5/5c/Flag_of_Alabama.svg/45px-Flag_of_Alabama.svg.png‘ }, { ‘name‘: ‘Alaska‘, ‘flag‘: ‘e/e6/Flag_of_Alaska.svg/43px-Flag_of_Alaska.svg.png‘ }, { ‘name‘: ‘Arizona‘, ‘flag‘: ‘9/9d/Flag_of_Arizona.svg/45px-Flag_of_Arizona.svg.png‘ }, { ‘name‘: ‘Arkansas‘, ‘flag‘: ‘9/9d/Flag_of_Arkansas.svg/45px-Flag_of_Arkansas.svg.png‘ }, { ‘name‘: ‘California‘, ‘flag‘: ‘0/01/Flag_of_California.svg/45px-Flag_of_California.svg.png‘ }, { ‘name‘: ‘Colorado‘, ‘flag‘: ‘4/46/Flag_of_Colorado.svg/45px-Flag_of_Colorado.svg.png‘ }, { ‘name‘: ‘Connecticut‘, ‘flag‘: ‘9/96/Flag_of_Connecticut.svg/39px-Flag_of_Connecticut.svg.png‘ }, { ‘name‘: ‘Delaware‘, ‘flag‘: ‘c/c6/Flag_of_Delaware.svg/45px-Flag_of_Delaware.svg.png‘ }, { ‘name‘: ‘Florida‘, ‘flag‘: ‘f/f7/Flag_of_Florida.svg/45px-Flag_of_Florida.svg.png‘ }, { ‘name‘: ‘Georgia‘, ‘flag‘: ‘5/54/Flag_of_Georgia_%28U.S._state%29.svg/46px-Flag_of_Georgia_%28U.S._state%29.svg.png‘ }, { ‘name‘: ‘Hawaii‘, ‘flag‘: ‘e/ef/Flag_of_Hawaii.svg/46px-Flag_of_Hawaii.svg.png‘ }, { ‘name‘: ‘Idaho‘, ‘flag‘: ‘a/a4/Flag_of_Idaho.svg/38px-Flag_of_Idaho.svg.png‘ }, { ‘name‘: ‘Illinois‘, ‘flag‘: ‘0/01/Flag_of_Illinois.svg/46px-Flag_of_Illinois.svg.png‘ }, { ‘name‘: ‘Indiana‘, ‘flag‘: ‘a/ac/Flag_of_Indiana.svg/45px-Flag_of_Indiana.svg.png‘ }, { ‘name‘: ‘Iowa‘, ‘flag‘: ‘a/aa/Flag_of_Iowa.svg/44px-Flag_of_Iowa.svg.png‘ }, { ‘name‘: ‘Kansas‘, ‘flag‘: ‘d/da/Flag_of_Kansas.svg/46px-Flag_of_Kansas.svg.png‘ }, { ‘name‘: ‘Kentucky‘, ‘flag‘: ‘8/8d/Flag_of_Kentucky.svg/46px-Flag_of_Kentucky.svg.png‘ }, { ‘name‘: ‘Louisiana‘, ‘flag‘: ‘e/e0/Flag_of_Louisiana.svg/46px-Flag_of_Louisiana.svg.png‘ }, { ‘name‘: ‘Maine‘, ‘flag‘: ‘3/35/Flag_of_Maine.svg/45px-Flag_of_Maine.svg.png‘ }, { ‘name‘: ‘Maryland‘, ‘flag‘: ‘a/a0/Flag_of_Maryland.svg/45px-Flag_of_Maryland.svg.png‘ }, { ‘name‘: ‘Massachusetts‘, ‘flag‘: ‘f/f2/Flag_of_Massachusetts.svg/46px-Flag_of_Massachusetts.svg.png‘ }, { ‘name‘: ‘Michigan‘, ‘flag‘: ‘b/b5/Flag_of_Michigan.svg/45px-Flag_of_Michigan.svg.png‘ }, { ‘name‘: ‘Minnesota‘, ‘flag‘: ‘b/b9/Flag_of_Minnesota.svg/46px-Flag_of_Minnesota.svg.png‘ }, { ‘name‘: ‘Mississippi‘, ‘flag‘: ‘4/42/Flag_of_Mississippi.svg/45px-Flag_of_Mississippi.svg.png‘ }, { ‘name‘: ‘Missouri‘, ‘flag‘: ‘5/5a/Flag_of_Missouri.svg/46px-Flag_of_Missouri.svg.png‘ }, { ‘name‘: ‘Montana‘, ‘flag‘: ‘c/cb/Flag_of_Montana.svg/45px-Flag_of_Montana.svg.png‘ }, { ‘name‘: ‘Nebraska‘, ‘flag‘: ‘4/4d/Flag_of_Nebraska.svg/46px-Flag_of_Nebraska.svg.png‘ }, { ‘name‘: ‘Nevada‘, ‘flag‘: ‘f/f1/Flag_of_Nevada.svg/45px-Flag_of_Nevada.svg.png‘ }, { ‘name‘: ‘New Hampshire‘, ‘flag‘: ‘2/28/Flag_of_New_Hampshire.svg/45px-Flag_of_New_Hampshire.svg.png‘ }, { ‘name‘: ‘New Jersey‘, ‘flag‘: ‘9/92/Flag_of_New_Jersey.svg/45px-Flag_of_New_Jersey.svg.png‘ }, { ‘name‘: ‘New Mexico‘, ‘flag‘: ‘c/c3/Flag_of_New_Mexico.svg/45px-Flag_of_New_Mexico.svg.png‘ }, { ‘name‘: ‘New York‘, ‘flag‘: ‘1/1a/Flag_of_New_York.svg/46px-Flag_of_New_York.svg.png‘ }, { ‘name‘: ‘North Carolina‘, ‘flag‘: ‘b/bb/Flag_of_North_Carolina.svg/45px-Flag_of_North_Carolina.svg.png‘ }, { ‘name‘: ‘North Dakota‘, ‘flag‘: ‘e/ee/Flag_of_North_Dakota.svg/38px-Flag_of_North_Dakota.svg.png‘ }, { ‘name‘: ‘Ohio‘, ‘flag‘: ‘4/4c/Flag_of_Ohio.svg/46px-Flag_of_Ohio.svg.png‘ }, { ‘name‘: ‘Oklahoma‘, ‘flag‘: ‘6/6e/Flag_of_Oklahoma.svg/45px-Flag_of_Oklahoma.svg.png‘ }, { ‘name‘: ‘Oregon‘, ‘flag‘: ‘b/b9/Flag_of_Oregon.svg/46px-Flag_of_Oregon.svg.png‘ }, { ‘name‘: ‘Pennsylvania‘, ‘flag‘: ‘f/f7/Flag_of_Pennsylvania.svg/45px-Flag_of_Pennsylvania.svg.png‘ }, { ‘name‘: ‘Rhode Island‘, ‘flag‘: ‘f/f3/Flag_of_Rhode_Island.svg/32px-Flag_of_Rhode_Island.svg.png‘ }, { ‘name‘: ‘South Carolina‘, ‘flag‘: ‘6/69/Flag_of_South_Carolina.svg/45px-Flag_of_South_Carolina.svg.png‘ }, { ‘name‘: ‘South Dakota‘, ‘flag‘: ‘1/1a/Flag_of_South_Dakota.svg/46px-Flag_of_South_Dakota.svg.png‘ }, { ‘name‘: ‘Tennessee‘, ‘flag‘: ‘9/9e/Flag_of_Tennessee.svg/46px-Flag_of_Tennessee.svg.png‘ }, { ‘name‘: ‘Texas‘, ‘flag‘: ‘f/f7/Flag_of_Texas.svg/45px-Flag_of_Texas.svg.png‘ }, { ‘name‘: ‘Utah‘, ‘flag‘: ‘f/f6/Flag_of_Utah.svg/45px-Flag_of_Utah.svg.png‘ }, { ‘name‘: ‘Vermont‘, ‘flag‘: ‘4/49/Flag_of_Vermont.svg/46px-Flag_of_Vermont.svg.png‘ }, { ‘name‘: ‘Virginia‘, ‘flag‘: ‘4/47/Flag_of_Virginia.svg/44px-Flag_of_Virginia.svg.png‘ }, { ‘name‘: ‘Washington‘, ‘flag‘: ‘5/54/Flag_of_Washington.svg/46px-Flag_of_Washington.svg.png‘ }, { ‘name‘: ‘West Virginia‘, ‘flag‘: ‘2/22/Flag_of_West_Virginia.svg/46px-Flag_of_West_Virginia.svg.png‘ }, { ‘name‘: ‘Wisconsin‘, ‘flag‘: ‘2/22/Flag_of_Wisconsin.svg/45px-Flag_of_Wisconsin.svg.png‘ }, { ‘name‘: ‘Wyoming‘, ‘flag‘: ‘b/bc/Flag_of_Wyoming.svg/43px-Flag_of_Wyoming.svg.png‘ }];
16         });
17     </script>
18
19 </head>
20 <body>
21     <script type="text/ng-template" id="customTemplate.html">
22         <a>
23             <img ng-src="http://upload.wikimedia.org/wikipedia/commons/thumb/{{match.model.flag}}" width="16">
24             <span ng-bind-html="match.label | uibTypeaheadHighlight:query"></span>
25         </a>
26     </script>
27     <div ng-controller="TypeaheadCtrl">
28         <input type="text" ng-model="selected" uib-typeahead="state as state.name for state in statesWithFlags | filter:{name:$viewValue}" typeahead-template-url="customTemplate.html" class="form-control" >
29     </div>
30 </body>
31 </html>

模板中的match表示智能提示列表中每一个匹配的选项,包含3个属性:id,label,model。label是绑定到列表中的每一项的文本,即state as state.name for state in statesWithFlags | filter:{name:$viewValue}中的state.name。model是列表中的每一项,即statesWithFlags数组中的每个元素。

效果是这样:

时间: 2024-11-06 01:40:21

AngularJs的UI组件ui-Bootstrap分享(十一)——Typeahead的相关文章

挂号平台首页开发(UI组件部分)

JQ插件模式开发UI组件 JQ插件开发方法: 1.$.extend() 扩展JQ(比较简单,功能略显不足) $.extend({ sayHello:function(){ console.log("hello~"); } }); $.sayHello(); 2.$.fn  向JQ添加新方法(这次选择这种方法) $.fn.blue=function(){ this.css("background","blue"); } $("div&qu

AngularJs的UI组件ui-Bootstrap分享(一)

最近几个月学习了AngularJs和扩展的UI组件,并在公司小组内做了一次分享交流,感觉很有收获,在此记录下个人的学习心得. 在一个实际的项目中,UI组件是必不可少的东西,然而由于你懂的原因,国内无法顺利访问AngularJs官网,关于AngularJs的UI组件国内资料很缺乏,本文就先介绍一下AngularJs最常用的UI组件——UI-Bootstrap 准备工作: 1.      既然UI-Bootstrap是Angularjs和Bootstrap的合体,那么它肯定要依赖于AngularJs

AngularJs的UI组件ui-Bootstrap分享(十四)——Carousel

原文地址:http://www.cnblogs.com/pilixiami/p/5724314.html Carousel指令是用于图片轮播的控件,引入ngTouch模块后可以在移动端使用滑动的方式使用轮播控件. <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-eq

工作流,WEB框架,UI组件网络收集整理

工作流,WEB框架,UI组件网络收集整理 在博客园上逛了好多年,随手收录了一些工作流,WEB开发框架,UI组件,现在整理一下与大家分享. 由于个人能力与精力有限,望各位园友在评论中补充,我将全部整理到正文: ? 工作流篇 RoadFlow工作流(收费):                  http://www.cqroad.cn/WorkFlow 驰骋工作流引擎 ccflow                       https://www.oschina.net/p/ccflow YbSof

Docz 用 MDX 写 React UI 组件文档

Docz 用 MDX 写 React UI 组件文档 前言 为了提升开发效率,创建一套 UI 组件库是一种较为有效的方式之一:可以减少重复工作.提高可复用,所以现在越来越多团队开始创建自己的 UI 组件库.较早的 Twitter 的 Bootstrap 虽然只能称为 UI 库,但也大大提升了开发效率.后面 MVVM 大行其道 ,前端终于可以把 HTML.CSS.JS 放在一起开发包含 UI .交互真正意义上的组件了,现在有基于 React 的 Material-UI.国内阿里金服基于 React

推荐 11 款 React Native 开源移动 UI 组件

推荐 11 款 React Native 开源移动 UI 组件 oschina 发布于 10个月前,共有 14 条评论 本文推荐 11 个非常棒的 React Native 开源组件,希望能给移动应用开发者提供帮助. React Native 是近期 Facebook 基于 MIT 协议开源的原生移动应用开发框架,已经用于 Facebook 的生产环境.React Native 可以使用最近非常流行的 React.js 库来开发 iOS 和 Android 原生 APP. 1. iOS 表单处理

封装一个简单的UI组件

方法其实很简单,用一个函数把整个过程包起来.调用时用new,这样可以在一个页面使用多个改组件.这是一个非常简单的方法,后面还有很大改进的空间.下面是一个封装日历的示例. 现在我们的组件类似bootstrap,写好下面的html结构,然后引入ui.css和ui.js,就可以生成相应的UI组件了.效果如上图. <!doctype html> <html> <head> <meta charset="UTF-8"> <title>C

交互设计:隐藏或显示大段文本的UI组件有哪些?

应用场景: 在手机上要给列表中的每一项添加一个大段的介绍,应该用什么UI组件 A: 这里可以用,模态对话框,弹出提示,工具提示这类组件.模态对话框的好处,就是用关闭的按钮,用户操作方便:而弹出提示和工具提示只能通过点击来切换 模态对话框: http://v2.bootcss.com/javascript.html#modals http://www.runoob.com/bootstrap/bootstrap-modal-plugin.html Bootstrap 模态框(Modal)插件 模态

学习通过Thread+Handler实现非UI线程更新UI组件

[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件 当一个程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理.所以主线程通常又被叫做UI线程 [H

cocos2d-iphone 与 UI组件

http://zhidao.baidu.com/link?url=v9d7y2doWqcPhKz1lz8TkO7ZQfslg-e-55JE0XP9VdKJ0vHobcLPEAXaXjD2lD-TGmgnaRzRc1g38ho-vM5qu_ cocos2d-iphone 与 UI组件 2013-03-07 04:11嚣张→恨天  分类:其他编程语言 | 浏览 145 次  悬赏:15 coco2d如何在场景中 添加 UIsearchbar UItoolbar之类的UI组件 或者 框架自身怎么实现搜