简介可以自动完成UI的AngularJS工具angular-smarty

   这篇文章主要介绍了简介可以自动完成UI的AngularJS工具angular-smarty,包括其中隔离作用域绑定指令符和promise的使用,需要的朋友可以参考下


  我们最近为我们的论坛增加了一个自动完成功能(称为Smarty),在要求专业人员简介的主页上。这是一个超有用的功能,因为它有助于我们将用户导航到他们真正想去的地方。它很有意思,也是用AngularJS构建的!

  我们希望Smarty能够:

  通过用户的给定输入 (一个前缀),通过一个HTTP请求后自动提供建议

  显示一个建议的下拉列表

  当用户输入时更新

  足够快,能够跟得上用户的输入

  导航直观且能够关闭

  可重用

  以往没有AngularJS的经验,这个项目是我使用这个框架的入门项目。它真的成为了一次宝贵的学习经验,而且我发现这个框架许多方面相互借鉴地很好且能很好地符合我上面列出的要求。当然,还有一些问题尚在学习过程中!

  AngularJS的乐趣所在

  我最喜欢Angular的一点是它是如何分解成具有明确目的的概念的。Smarty广泛使用了其中的两个概念——Directives 和 Services。Directive和DOM绑定在了一起,用来管理和元素之间的交互;而Service通过依赖注入的方式为Controller和Directive提供了独立的可以重用的逻辑。

  Angular提供了很多内建的Directive和Service,我们在这个项目中使用到了其中的多个。

  为了显示建议(见要求2),我们使用了ngIf 和 ngRepeat 指令来有条件的显示和填充建议下来列表。

  为了实现当用户输入的时候更新建议内容(见要求3),我们使用了ngModel 指令将$scope上前缀变量上输入元素的请求和Scope上的$watch方法双向绑定起来,用来监听前缀的变化。

  我们需要考虑的一件事是这个自动完成功能的更新速度可能跟不上用户的输入速度(见要求4)。因为每当前缀的值发生变化时,Smarty都要发送一个HTTP请求(通过内建的$http Service)。我们决定用 $http 的可选配置参数($http.get(requestUrl, {cache: true}))来缓存结果。这是提升性能的一个很简单的方法。

  我们还写了自定义的Directive和Service来满足我们的特定需求:

  smartySuggestor Service:smartySuggestor 提供了一个getSmartySuggestions()函数,用来接受用户生成的前缀作为它的参数,并通过http请求访问我们后端的suggestor服务来得到自动完成的建议。(见要求1)。

  smartyInput Directive: 我们所面临的一个挑战是,定义出一个用户和下拉列表之间的所有可能的交互,并且写测试用例,以确保在开发期间和开发之后,这些功能都是完好的。我们使用一个Directive(smartyInput)来包含用户和下拉列表之间所有可能发生的交互(见要求6),同时,我们使用内建的ng-mouseover 和 ng-click 指令(Directive)来定义下拉列表和鼠标事件之间的交互。

  正如我前边所提到的,我们所面临的一个挑战是我们要确保我们没有破坏掉所有用户和下拉列表之间可能发生的交互方式。为了追踪这些用户交互,并确保我们没有在开发的过程中破坏掉它,我们使用了Jasmine测试框架。Jasmine结合这angular-mocks一块儿使用,可以方便我们为smarty写包含描述的测试用例,像我们可以为下拉列表写“点击外部应该会消失”("should disappear on outside click"),可以为请求表单的输入写“按回车时应该填充上合适的值” (“should, on enter, fill with the appropriate value”)。

  学习总结

  尽管简洁实用的AngularJS框架现在对我来讲,是可以轻松读懂的,但是确实要花些时间来学习。隔离作用域绑定指令符和promise是我学习过程中特别棘手的两项专题。当我研究隔离作用域时,我发现自己十分希望能看到更多的关于人们如何在他们的项目中使用不同绑定的例子,所以下面我为每种绑定类型给出一个例子。

  =:本地和父作用域之间的双向数据绑定

  控制器:

  ?

  1$scope.selected = -1;

  HTML:

  ?

  1

  SmartyInput指令符:

  ?

  1scope: {index: "=", ...}

  SmartyInput双向绑定指令符将位于控制器作用域的selected绑定到指令作用域的index索引上面,这样可以使得在index索引(建议列表中当前选定的索引)中的变化结果与指令(例如用户按向上/向下箭头)的相互作用会传播到控制器。

  &: 本地与父作用域之间的单向数据绑定

  控制器:

  ?

  1$scope.setSelected = function(newValue) {...};

  HTML:

  ?

  1

  SmartyInput指令符:

  ?

  1scope: {select: "&", ... }...scope.select({"x": parseInt(scope.index) + 1});

  SmartyInput指令符将控制器作用域中的setSelected()函数绑定到指令作用域中的select()函数上,这样可以使指令符在不改变setSelected()函数的情况下使用它。

  @:将计算表达式绑定到本地作用域

  控制器:

  ?

  1$scope.prefix = ""

  HTML:

  ?

  1

 

  SmartySuggestions指令符:

  ?

  1scope: {prefix: "@", ...}

  通过SmartySuggestions指令符,可在建议菜单中显示prefix的值,所以此处使用计算表达式{{prefix}}。这种绑定方式在多项复杂表达式中更常用,比如:next-index=“{{selected + 1}}”。

  Promises

  promise是用于执行异步任务的技术。一个promise具有一个名为then()的方法,该方法在promise执行时会作为被执行的的回调函数的一个参数。当异步任务完成,promise会将一段消息传给那个回调函数。当用户输入的prefix前缀中检测到更改,则promise就会出现在Smarty的代码中,然后我们会用$http执行一个GET请求,用来更新显示给用户建议的列表。

  这个过程看起来是这样的:

  当$scope.$watch在$scope.prefix(请注意,此处绑定到用户UI输入界面)的值中注册了一个更改,此时会调用getSmartySuggesction()。

  ?

  1

  2var promise = smartySuggestor.getSmartySuggestions($scope.prefix);promise.then(function(data) {

  $scope.suggestions = data;});

  在getSmartySuggesctions()中,$http.get会返回一个参与服务器响应的promise。

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13function getSmartySuggestions(prefix) {

  requestParams["query"] = escape(prefix.toLowerCase());

  var promise = $http.get(requestUrl(),

  {

  params: requestParams,

  cache: true

  }

  ).then(function(response) {

  return response.data.slice(0, 5).map(function(item) {

  return item.Name;

  });

  });

  return promise;}

  服务器响应看起来是这样的:

  ?

  1[{"ID":13,"Name":"Portrait Photography"},{"ID":24,"Name":"Commercial Photography"},{"ID":21,"Name":"Pet Photography"},{"ID":16,"Name":"Event Photography"},{"ID":26,"Name":"Headshot Photography"}]

  接下来,我们会调用存在于promise中的then()方法,在解析服务器响应回调中进行传递。then()方法返回一个新的promise,它处理了解析过的响应,并存储到通过getSmartySuggestions()返回的promise中。

  解析过的响应看起来是这样的:[“Portrait Photography”, “Commercial Photography”, “Pet Photography”, “Event Photography”, “Headshot Photography”]。

  最终,回到$scope.$watch,我们调用promise中的then()方法,为变量suggestions分配这些解析过的响应。

  ?

  1

  2

  3

  4var promise = smartySuggestor.getSmartySuggestions($scope.prefix);

  promise.then(function(data) {

  $scope.suggestions = data;

  });

时间: 2024-11-01 17:24:01

简介可以自动完成UI的AngularJS工具angular-smarty的相关文章

19个免费的UI界面设计工具及资源

原文:http://www.oschina.net/news/16602/19-free-ui-design-tools-toolkits-and-resources-for-designers 开源中国社区刚发布了一篇<21个免费的UI界面设计工具.资源及网站>,介绍了免费的Web UI.移动UI.线框工具等.作为该文章的续篇,本文再介绍19个免费UI设计工具及资源,目的同样是帮助你通过发现新的.完美的工具来学习新的技能. 列表如下: DHTMLX DHTMLX 是一个JavaScript库

Windows pyqt4 bat自动转换UI文件--&gt;.pyw文件

/***************************************************************************** * Windows pyqt4 bat自动转换UI文件-->.pyw文件 * 声明: * 由于在Windows下面操作pyqt4,将UI文件转换成.pyw文件是需要到dos窗口去 * 执行pyuic4命令,每次感觉都很麻烦,于是想起可以使用bat文件进行批处理,这 * 样的话,直接双击运行bat文件就行了. * * 2015-12-30 深

AngularJs Understanding Angular Templates_AngularJS

angular template是一个声明规范,与model.controller的信息一起,渲染成用户在浏览器中所看到的视图.它是静态的DOM,包括HTML.CSS.angular特别的元素和angular指定的元素属性.angular元素和属性指示angular去扩展行为以及将template DOM转换为动态视图的DOM. 下面是我们可以在template中使用的angular元素已经元素属性的类型: Directive(http://www.jb51.net/article/91739.

AWStats简介:Apache/IIS的日志分析工具_网站应用

你完全不必耐心看完所有内容:简要安装说明如下安装http://sourceforge.net/projects/awstats/ 下载安装包后:GNU/Linux:tar zxf awstats-version.tgzawstats的脚本和静态文件缺省都在wwwroot目录下:将cgi-bin目录下的文件都部署到 cgi-bin/目录下:/home/apache/cgi-bin/awstats/ mv awstats-version/cgi-bin /path/to/apache/cgi-bin

21个免费的UI界面设计工具、资源及网站

原文:http://www.oschina.net/news/16527/21-free-ui-tools-resources-websites 来自51CTO的文章,本文将介绍一些UI界面与设计使用的元素.软件和网站.内容很丰富,适合用户体验设计师.界面设计师.产品设计师.JS前段开发.手机产品设计以及iPad和平板电脑产品设计等使用. Lumzy 官方地址:http://www.lumzy.com/ Lumzy是一个网站应用和原型界面制作工具.使用Lumzy,您可以轻松创建UI模型并即时发送

Eclipse Java UI 可视化设计工具 windowbuilder 的安装

原文 http://blog.csdn.net/mimitracely/article/details/8000696   在Eclipse下,在线安装windowbuilder的方法: 选择help->install new software: 点击add添加地址: http://dl.google.com/eclipse/inst/d2wbpro/latest/4.2 下载对应eclipse版本的插件 ,我的eclispe是4.2版本,如果是3.6将4.2改成3.6即可, 选择设计UI的类型

米儿文章管理系统功能简介与官方下载地址_常用工具

 后台生成静态页面     · 二级分类管理     · 站内公告.友情链接管理     · 预留广告位,可在后台修改广告信息     · 上传附件管理,静态页面文件管理     · 后台自动完成数据备份.数据还原     · 添加文章.修改文章.删除文章操作灵活     · 自由设置网站.分类.文章关键字,灵活优化网站     · 界面清新,优雅大方     · 终生免费升级   米儿文章管理系统 V1.0 下载: 免费下载

Sentinella 自动管理计算机模式的小工具

Sentinella 光听名字您可能判断不出来它是干什么的,这个软件可以用来管理您的计算机在什么情况下自动做出关机.重启.挂起.休眠.运行程序等等动作. 您只需要按照您的需求,预设一些条件,当您的计算机满足这些条件的时侯,它就会按您条件所满足后要执行的任务的需求来执行任务. 比如您可以设置您的计算机如果没有流量的话就自动关机,或者 CPU 符合达到多少以后就杀死那些程序,等等. 项目主页:http://sentinella.sourceforge.net/ 如何安装: 如果您是在 Ubuntu

自动执行Nmap扫描的工具:LazyMap

LazyMap可以自动进行nmap扫描,并且能自动生成定制的Nessus策略. 特点 扫描存活的设备 对发现的设备自动进行端口扫描 可以同时在多个网卡上运行多个实例 为每次扫描生成一个参考目录 以Nessus格式输出开放的端口,实现在Nessus中快速扫描 默认以T4速度扫描.如果你认为这太慢了,在扫描窗口中输入CTRL C,它就会清空并重新以T5速度扫描. 日志记录开始和结束时间.存活主机.开放端口 针对扫描出的端口,自动创建一个定制的Nessus策略,加快扫描速度 请仔细阅读脚本的开头部分,