基于jQuery UI Autocomplete的AngularJS 指令(directive)扩展

简介:

      在前几篇随笔简单介绍了AngularJS,在AngularJS 指令(directive)是重要的概念,主要负责了很大部分的组建样式交互。在前面介绍过directive需要预先的模板编译在返回一个link的函数,注册行为事件交互等等。在这里不多说了,关于指令的介绍将在后续一并补上。在这里我们先看一个利用jQuery UI组件开发的AngularJS Autocomplete指令。

代码:jsfiddle在线测试

Directive:  

复制代码
 1  var oldSuggest = jQuery.ui.autocomplete.prototype._suggest;
 2 jQuery.ui.autocomplete.prototype._suggest =  function(items) {
 3      var itemsArray = items;
 4      if ( this.options.maxItems &&  this.options.maxItems > 0) {
 5         itemsArray = items.slice(0,  this.options.maxItems);
 6     }
 7     oldSuggest.call( this, itemsArray);
 8 };
 9 
10  var autocomplete =  function() {
11      var linkFun =  function($scope, element, attrs) {
12          var $input = jQuery(element);
13          var responseDataSource =  function($scope, source, pattern, response) {
14              var express = $scope[source];
15              var data =  typeof(express) === "function" ? express(pattern, response) : express;
16              if (data) {
17                 response(data);
18             }
19         };
20          var option = attrs;
21          //
22          option.position = {
23             my: attrs.positionMy,
24             at: attrs.positionAt,
25         };
26          var option = jQuery.extend({
27             position: {
28                 my: "",
29                 at: ""
30             },
31             close:  function(event, ui) {
32                  var express = attrs["ngModel"] + "='" + $input.val() + "'";
33                 $scope.$apply(express);
34                 $scope.$eval(attrs["ngChange"]);
35             }
36         }, option);
37         option.remote = option.remote === "true";
38          if (!option.remote) {
39             option.dataSource = attrs.source;
40             option.source =  function(pattern, response) {
41                  var option = $input.autocomplete("option");
42                  var responseEx =  function(data) {
43                      var matches = jQuery.map(data,  function(tag) {
44                          var startWith = attrs.startWith === "true";
45                          var index = tag.toUpperCase().indexOf(pattern.term.toUpperCase())
46                          if ((startWith && index === 0) || (!startWith && index > -1)) {
47                              return tag;
48                         }
49                     })
50                     response(matches);
51                 };
52                 responseDataSource($scope, option.dataSource, pattern, responseEx);
53             };
54         }  else {
55             option.source = option.source;  // remote url
56          }
57         $input.autocomplete(option);
58     };
59      return linkFun;
60 };
61 
62  var prefixed = "green";
63  var appMoule = angular.module('app', []);
64 
复制代码

65 appMoule.directive(prefixed + "Autocomplete", autocomplete); 

   在指令中主需要标注html attribute green-autocomplete=””引用.

以及一些特殊option

  1.        Remote(Boolean)是否为远程调用,truesourceurlfalse则为scope上的一个属性或者函数。
  2.        Source:数据源,urlscope属性或者函数。
  3.        min-length:开始显示下拉条的最小长度。
  4.        position-myposition-atjQuery下拉条显示样式
  5.       start-with:(Boolean)是否为以前缀开始的帅选,默认false(包含)。
  6.    max-items:显示最大下拉项数目。

 

  测试代码:

  html: 1 <div ng-app="app" ng-controller="Test">

复制代码
 2  < div  class ="ui-widget" >
 3      < label  for ="tags" >Tags(变量):  </ label >
 4      < input  id ="tags"  ng-model ="val"  green-autocomplete =""  remote ="false"  ng-disabled ="val=='Asp'"  source ="getsource"   min-length ="0"  position-my ="right top"  position-at = "right bottom"   start-with ="false" >
 5  </ div >
 6  < br />
 7     {{val}}
 8     
 9      < div  class ="ui-widget" >
10      < label  for ="tags" >Tags(函数):  </ label >
11      < input  i ng-model ="val_Array"  green-autocomplete =""   source ="availableTags"  max-items ="5"  min-length ="2"   start-with ="true"  ng-change ="change();" >
12  </ div >
13  < br />{{val_Array}}
14   http://XX/XX.php?term={0}
15      < div  class ="ui-widget" >
16      < label  for ="tags" >Tags(url):  </ label >
17      < input  i ng-model ="val_url"  green-autocomplete =""   source ="url"  remote ="true"  max-items ="3"   >
18  </ div >
19  < br />
20     {{val_url}}
21  </ div >
复制代码

  javascript

复制代码
 1  // test controller
 2  var test =  function($scope) {
 3     $scope.availableTags = [
 4         "ActionScript",
 5         "AppleScript",
 6         "Asp",
 7         "BASIC",
 8         "C",
 9         "C++",
10         "Clojure",
11         "COBOL",
12         "ColdFusion",
13         "Erlang",
14         "Fortran",
15         "Groovy",
16         "Haskell",
17         "Java",
18         "JavaScript",
19         "Lisp",
20         "Perl",
21         "PHP",
22         "Python",
23         "Ruby",
24         "Scala",
25         "Scheme"
26         ];
27 
28     $scope.getsource =  function(pattern, response) {
29         response($scope.availableTags);
30     };
31     $scope.change =  function() {
32         console.log('change', $scope.val_Array);
33     };
34 };
35 
36 appMoule.controller("Test", test);
37  // mock ajax.
38  var oldAjax = jQuery.ajax;
39 jQuery.ajax =  function(param) {
40      if (param.url === "url") {
41          var term = param.data.term;
42         param.success([term + "1", term + "2", 3 + term, 4 + term]);
43     }
44      else {
45         oldAjax(param);
46     }
47 };
48 
复制代码

49 //jQuery.ajax({url:"text.html"}); must erroe:GET http://fiddle.jshell.net/_display/text.html 404 (NOT FOUND) 

 

 在测试中为了验证url,本想通过自己的博客导入json数据,但是跨域等问题,所以没办法,在最后选择了mock jQuery.Ajax,本想引入jasmine测试框架利用spyOn(jasmine测试mock文档:
http://pivotal.github.com/jasmine/jsdoc/symbols/jasmine.Spy.html),但是找了很久没找到在线引用包。最后采用手动血mock代码如下:

   
   
复制代码
 1  // mock ajax.
 2    var oldAjax = jQuery.ajax;
 3  jQuery.ajax =  function(param) {
 4       if (param.url === "url") {
 5           var term = param.data.term;
 6          param.success([term + "1", term + "2", 3 + term, 4 + term]);
 7      }
 8       else {
 9          oldAjax(param);
10      }
11  };
复制代码
 所以你看见的第三个返回值永远会是输入前缀加1,2,3.
 测试第一输入框测试scope属性,第二测试scope函数(有两个输入参数),第三测试url ajax


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2012/09/02/2667365.html


相关文章
|
JSON 前端开发 JavaScript
【前端】使用jQuery封装一套UI组件 - 级联选择器组件
本篇文章来讲解下级联选择器组件 级联选择器,在实际项目中也是比较常用的组件,比如:省市区三级关联,上下级联动等 最后面会附上全部代码
1355 0
|
6月前
|
Web App开发 缓存 JavaScript
JQuery Kendo UI使用技巧总结
JQuery Kendo UI使用技巧总结
47 4
|
2月前
|
JavaScript 前端开发 Java
jQuery Autocomplete
jQuery Autocomplete
18 4
|
4月前
|
JavaScript 前端开发
如何在Vue2.X/Vue3.X项目引入jQuery,以及增加jQuery.easing扩展?让你的动画效果更加丝滑!
如何在Vue 2或Vue 3项目中引入jQuery及其动画扩展库jQuery.easing,以实现更丰富的动画效果。
196 0
如何在Vue2.X/Vue3.X项目引入jQuery,以及增加jQuery.easing扩展?让你的动画效果更加丝滑!
|
7月前
|
JavaScript UED
jQuery Autocomplete
jQuery Autocomplete 是一个基于 jQuery 的插件,它为输入框或文本区域提供了自动完成功能。当用户在输入框中输入文本时,Autocomplete 可以根据用户输入的文本自动匹配并显示相关建议的选项。用户可以从中选择一个选项,而不需要手动输入完整的单词
58 2
jquery-easyui和jquery-ui的slider冲突解决
jquery-easyui和jquery-ui的slider冲突解决
|
JavaScript 前端开发 程序员
【前端】使用jQuery封装一套UI组件 - 是和否滑动切换组件
本篇文章来讲解下是和否的滑动切换组件 切换滑动组件,使用的场景实际上就是一个开和关的场景,一般有是和否,开和关,禁用和启用等等,只需要设置0和1即可
153 0
|
JavaScript 前端开发 程序员
【前端】使用jQuery封装一套UI组件 - 可编辑下拉框组件
下拉框也是比较常用的组件,对应原生的下拉标签就是select 本篇文章就来讲讲可编辑下拉框组件的封装过程
371 0
|
JavaScript 前端开发 程序员
【前端】使用jQuery封装一套UI组件 - 移动端时间选择组件
【首先要声明一点,技术不分好坏,能用好就行,不用鄙视老技术】 今天要给大家展示的是移动端时间选择组件 最开始,看到比较新颖的移动端时间选择组件是在某款手机上,分年月日下拉选择,UI界面也挺好看的 除了讲解实现的步骤以及关键点,文章最后面会有完整的代码
251 0
|
前端开发 JavaScript 程序员
【前端】使用jQuery封装一套UI组件 - 单选框
目前前端技术发展非常快,各大厂都开源和分享了自家的前端框架,非常多成熟的UI组件供大家选择,很实用也很方便,给开发上节省了不少时间成本,当然少不了学习成本,不过也不会占用太多时间,只要有前端基础的话,原理基本都是通用的,只是写法不一样。 因此,除了学习现有的优秀前端之外,最好能自己根据原理封装一套自己的UI组件,目的是为了更好的理解前端知识点以及锻炼编程逻辑
173 0