`

AngularJS封装jQuery Datepicker

阅读更多

        在开始编码之前,我们必须想好组件的外观和运行方式。例如,我们想在HTML中像下面这样定义datepicker:

<input datepicker ng-model="currentDate" select="updateMyText(date)"></input>

        也就是说,我们需要修改Input输入标签,新增一个datepicker属性,然后 给它扩展更多功能(例如使用模型进行数据绑定,以及当选中了日期之后能够获得通知)。那么,我们应该如何实现呢?

        我们将会复用现有的控件,也就是jQuery UI提供的datepicker,而不是重新构建一个datepicker。我们只需要把它挂接到AngularJS上,然后启动它所提供的接口。

DatePickerDirective.js

angular.module('myApp.directives',[])
	.directive('datepicker', function() {
		return {
			//强制AngularJS把指令限定为只支持属性
			restrict: 'A',
			//总是和ng-model配合使用
			require:'?ngModel',
			scope: {
				//此方法需要与预先定义好,然后传递给视图控制器中的指令
				select: '&'	//把我们所引用的select函数绑定到右边的作用域中
			},
			link: function(scope, element, attrs, ngModel) {
				if(!ngModel) return;
				
				var optionsObj = {};
				
				optionsObj.dataFormat = 'mm/dd/yy';
				var updateModel = function(dateTxt) {
					scope.$apply(function() {
						//调用AngularJS内部的工具更新双向绑定关系
						ngModel.$setViewValue(dateTxt);
					});
				};
				
				optionsObj.onSelect = function(dateTxt, picker) {
					updateModel(dateTxt);
					if(scope.select) {
						scope.$apply(function() {
							scope.select({date: dateTxt});
						});
					}
				};
				
				ngModel.$render = function() {
					//使用AngularJS内部的'binding-specific'变量
					element.datepicker('setDate', ngModel.$viewValue || '');
				};
				element.datepicker(optionsObj);
			}
		};
	});

        我们还来看一看其中一些比较重要的东西。

        1.ng-model

        我们把一个ng-model属性传递给了指令所关联的函数。通过ng-model(它会托管指令的执行,因为所需要的属性都处于指令定义内部)可以定义,在指令的上下文中,连接到ng-model上的属性和对象应该具有何种行为。这里有两件事性需要注意:

        a.ngModel.$setViewValue(dateTxt)

        当AngularJS外部发生了某件事情的时候(在这个例子中是指jQuery UI datepicker的onSelect事件),需要调用此函数。这样就可以让AngularJS知道,它应该更新模型了。一般来说,当DOM事件发生的时候会调用它。

        b.ngModel.$render

        这是ng-model的另一个组成部分。它会告诉Angular,当模型发生变化的时候应该如何刷新视图。在这个例子中,我们只会把jQuery UI的datepicker变化之后的值传递过去。

        2.绑定select

        我们不会使用属性值进行编写、再根据作用域把它当做字符串来执行(在这种情况下,嵌套的函数和对象不可访问)的方式;而是会使用函数绑定技术(也就是“&”作用域绑定)。这样做在作用域上创建了一个新的函数,叫做select,它有一个参数——一个对象。这个对象中的每一个key都必须与HTML中所指定的参数一致(HTML就是使用指令的地方),key所对应的值将会被传递给函数对应的参数。这样带来的另一个优点是:控制器被解耦合了,它不再需要知道任何与DOM或者指令相关的内容。回调函数只需要执行它的动作,然后给出一些参数,而没有必要知道与数据绑定或刷新相关的内容。

        3.调用select

        注意,我们把一个optionOjb传递给了datepicker,同时也传递了一个onSelect函数。jQuery UI负责调用onSelect函数,它一般在AngularJS外部的执行上下文中进行调用。当然,在类似onSelect的函数被调用时,AngularJS是毫不知情的,所以我们有责任让AngularJS知道它需要进行何种操作。怎么才能做到这一点呢?使用scope.$apply即可。

        现在,我们可以在scope.$apply的外部简单地执行$setViewValue并调用scope.select,然后再调用scope.$apply()。但是,这样一来,在这两个步骤中任何一个里面所发生的异常都会被默默地忽略掉。如果异常发生在scope.$apply函数内部,则它们可以被AngularJS捕获到。

DatePickerController.js

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

app.controller('MainCtrl', function($scope) {
	$scope.myText = 'Not Selected';
	$scope.currentDate = '';
	$scope.updateMyText = function(date) {
		$scope.myText = 'Selected';
	};
});

        以上代码声明了一个控制器,设置了一些作用域变量,然后创建了一个作用域方法(updateMyText),在后面我们会把这个方法绑定到datepicker的on-select事件上。

DatePickerHtml.html

<!DOCTYPE html>
<html ng-app="myApp">
	<head lang="en">
		<meta charset="utf-8"></meta>
		<title>AngularJS Datepicker</title>
		<script src="jquery/jquery-1.8.3.js"></script>
		<script src="jquery-ui/js/jquery-ui-1.9.2.js"></script>
		<script src="angular/angular.js"></script>
		<link rel="stylesheet" href="jquery-ui/css/custom-theme/jquery-ui-1.9.2.css"></link>
		<script src="directive/DatePickerDirective.js"></script>
		<script src="controller/DatePickerController.js"></script>
		<script src="jquery-ui/js/jquery.ui.datepicker-zh-CN.js" type="text/javascript" charset="gb2312"></script>
	</head>
	<body ng-controller="MainCtrl">
		<input id="dateField" datepicker ng-model="$parent.currentDate" select="updateMyText(date)"></input>
		<br></br>
		{{myText}} - {{currentDate}}
	</body>
</html>

        注意这里是如何指定select属性的。作用域中并没有"date"值,但是由于我们在指令中设置了函数绑定的方式,所以AngularJS知道这个函数将会接受一个名为"date"的参数,它就是当datepicker上的onSelect被调用时我们所指定的对象。

        注意一个细节:我们把ng-model设置成了$parent.currentDate,而不是currentDate。这是为什么呢?因为我们的指令将会创建一个独立的作用域,这样就可以用它来绑定select函数了。这就导致了currentDate不再被连接到ng-model上,即使我们专门进行了设置。因此,我们需要明确地告诉AngularJS,它需要引用的currentDate并不在这个独立的作用域中,而是在父作用域中。

        通过这种方式,当你把应用加载到浏览器之后,将会看到一个文本框,点击它就会打开一个jQuery UI的datepicker。选择日期之后,屏幕上的文本就会从"Not Selected"更新成"Selected",并加上你所选择的日期。同时,输入框中的日期也会被刷新。如下所示:



资料来源:《用AngularJS开发下一代Web应用》

  • 大小: 14.4 KB
  • 大小: 12.7 KB
  • 大小: 28.4 KB
分享到:
评论

相关推荐

    jquery datepicker日期选择插件鼠标点击text

    jquery datepicker日期选择插件鼠标点击text jquery datepicker日期选择插件鼠标点击text jquery datepicker日期选择插件鼠标点击text jquery datepicker日期选择插件鼠标点击text

    jquery datepicker 时分秒

    `jQuery UI Datepicker` 是一个流行的 JavaScript 库,用于在网页上添加日期选择功能。它源自 jQuery 库,提供了一种简单、用户友好的方式来处理日期输入。在这个特定的场景中,我们不仅关注基本的日期选择,还涉及...

    js完美日期选择器,jQuery Datepicker最新demo,包括所有语言包

    **jQuery Datepicker** 是一个广泛使用的JavaScript库,用于在网页上添加交互式的日期选择功能。这个库基于流行的jQuery框架,提供了丰富的自定义选项,样式美观,兼容性良好,且支持多语言,使得它在全球范围内非常...

    jquery datepicker 小例子

    jQuery UI中的`datepicker`是一个非常流行的JavaScript组件,用于在网页上添加日历选择功能。它提供了丰富的自定义选项,使得日期选择器可以适应各种界面设计和功能需求。在这个"jquery datepicker 小例子"中,我们...

    JQuery Datepicker 多选日期

    在网页开发中,jQuery UI 的 Datepicker 是一个广泛使用的组件,它为用户提供了方便的日期选择功能。然而,原生的 Datepicker 默认情况下只允许选择单个日期。本主题将深入探讨如何通过扩展和定制,实现 jQuery ...

    jQuery Datepicker用到的js和CSS文件

    jQuery Datepicker用到的js和CSS文件 jquery-ui.css jquery-ui-timepicker-addon.css jquery-1.7.2.js jquery-ui.min.js jquery-ui-timepicker-addon.js jquery-ui-sliderAccess.js jquery-ui-timepicker-zh-CN.js

    ASP.NET jquery datepicker的使用

    首先,要使用jQuery的datepicker,你需要引入jQuery UI库,它包含了datepicker组件。你可以从官方站点(https://jqueryui.com/)下载最新版本,或者通过CDN(内容分发网络)链接将其添加到你的HTML文件中。例如: `...

    日期选择器:jquery datepicker的使用

    日期选择器在网页开发中是常见的一种交互组件,它能够帮助用户方便地选取日期,而jQuery UI中的datepicker组件就是这样一个强大的工具。本文将详细介绍如何在项目中使用jQuery UI的datepicker,以及它的一些主要功能...

    jQuery Datepicker 日期选择插件

    jQuery Datepicker 是一个非常流行的前端开发插件,用于在网页中添加日期选择功能。这个插件是jQuery UI库的一部分,提供了丰富的自定义选项和多语言支持,使得在网页上实现美观且用户友好的日期输入变得简单。在本...

    jquery 日期选择 datepicker

    jQuery UI中的日期选择器(DatePicker)是一个非常流行的前端组件,用于在网页上提供方便的日期输入功能。这个组件使得用户可以以日历的形式选择日期,而不是手动输入,从而提高了用户体验和数据准确性。以下是对`...

    jquery datepicker today clear 实现 (日期区间选择)

    jquery datepicker today clear 扩展实现,全网惟一资源。 当时项目要用,在网上没找到现成的,找到的都是需要修改源代码的,自己最后看源码实现的扩展,没有污染源码,如果项目有需要,拿去直接用就行了。 而且日期...

    jquery datepicker

    jQuery UI Datepicker是一个非常流行的JavaScript库,用于在网页上添加日期选择器功能。这个库是jQuery UI框架的一部分,提供了一种优雅、用户友好的方式来输入或选择日期。以下是对`jQuery UI Datepicker`的详细...

    jquery - datePicker

    **jQuery datePicker 知识点详解** `jQuery datePicker` 是一个非常流行且实用的JavaScript插件,主要用于在网页中添加日期选择功能。它以其简洁的API和丰富的自定义选项深受前端开发者的喜爱。在这个主题中,我们...

    jQuery UI Datepicker插件timepicker时分秒

    《jQuery UI Datepicker插件与timepicker时分秒扩展详解》 在Web开发中,日期和时间的选择常常是一项必不可少的功能,jQuery UI Datepicker插件是一个非常流行的选择工具,它为用户提供了直观、易于使用的日期选择...

    jQuery datepicker 日期选择器 中文汉化版 开始日期结束日期

    jQuery UI的日期选择器(jQuery datepicker)是一个广泛使用的组件,尤其在网页表单中用于输入日期时。这个组件提供了一个优雅、用户友好的界面,允许用户通过日历视图来选择日期,而不是手动输入。在中文环境中,...

    jquery datepicker cn en

    jquery datepicker cn en

    jQuery多功能日期时间选择器datepicker.zip

    《jQuery日期时间选择器datepicker深度解析》 在Web开发中,日期和时间的选择是一个常见的功能需求,用户界面的友好性和易用性对于提升用户体验至关重要。jQuery的datepicker插件以其丰富的功能和灵活的定制性,...

    jquery datepicker 日历显示控件 超牛

    《jQuery Datepicker:超牛日历显示控件的深度解析》 在Web开发中,日期选择器是一个不可或缺的组件,它极大地提升了用户交互体验。jQuery UI中的Datepicker控件就是一个非常强大且灵活的日历插件,它能轻松满足...

    jquery.datepicker-zh-CN.js

    jquery datepicker 的中文包 调用方法 &lt;script src="./public/js/jquery-ui-1.10.3.min.js"&gt; &lt;script src="./public/js/jquery.datepicker-zh-CN.js"&gt;&lt;/script&gt; &lt;link href="./public/css/jqueryui/jquery-ui-...

Global site tag (gtag.js) - Google Analytics