详解angular2采用自定义指令(Directive)方式加载jquery插件


Posted in Javascript onFebruary 09, 2017

由于angular2兴起不久,相关插件还是很少,所以有时候不得不用一些jquery插件来完成项目,

那么如何把jquery插件放到angular2中呢?采用自定义指令!

在上下文之前要引入jquery,这点不再描述

首先创建一个指令,采用@input方式,来获取jquery插件所需要的参数。

在ngOnChanges时,也就是参数通过@input传入时,初始化jquery插件,

初始化jquery插件需要获取dom元素,所以我们引入ElementRef,用来获取dom元素

这里需要讲一下,jquery中回调函数,如果直接使用this,回调是无法获取angular的函数的

所以这里采用bind的形式,把this传递进去。这样在angular中的函数才会被正确调用。

以下为实现时间插件的代码:

import { Directive, Output, Input, ElementRef, EventEmitter } from '@angular/core';

// 引入jquery.daterangepicker插件相关JS和css,Css打包时需要打包成单个文件,或者直接在html单独引用
// 如何单独打包请看下节代码

require('../../../../assets/lib/bootstrap-daterangepicker-master/daterangepicker.js');
require('../../../../assets/lib/bootstrap-daterangepicker-master/daterangepicker.css');

// 自定义指令
@Directive({
 selector: '[dateRangePicker]',
})

export class DateRangePicker {

 /**
  * jquery.daterangepicker插件所需的参数
  * 参数:http://www.daterangepicker.com/#options
  */
 @Input() public dateRangePickerOptions: IJQueryDateRangePicker;

 // 选中事件
 @Output() selected: any = new EventEmitter();

 /**
  * 初始化
  * @param _elementRef
  */
 constructor(private _elementRef: ElementRef) {
 }

 /**
  * 属性发生更改时
  * @private
  */
 ngOnChanges() {
  $(this._elementRef.nativeElement).daterangepicker(this.dateRangePickerOptions, this.dateCallback.bind(this));
 }

 /**
  * 时间发生更改时使用emit传递事件
  * @private
  */
 dateCallback(start, end) {
  let format = "YYYY-MM-DD";
  if (this.dateRangePickerOptions.locale.format) {
   format = this.dateRangePickerOptions.locale.format;
  }
  let date = {
   startDate: start.format(format),
   endDate: end.format(format),
  }

  this.selected.emit(date);
 }

}
import { Component } from '@angular/core';
import { DateRangePicker } from '../../theme/directives';


@Component({
 selector: 'dashboard',
 template: `
   <div class="form-group">
        <label for="startDate">{date.startDate}</label>
        <input 
        dateRangePicker 
        [dateRangePickerOptions]="option"    
        (selected)="dateSelected($event)" 
        type="text" 
        class="form-control">
   </div>
 `,
 directives: [DateRangePicker]
})
export class Dashboard {

 /**
  * 当前选中的时间
  */
 public date: any

 /**
  * jquery时间插件参数
  */
 private option: Object = {
  locale: {
   format: "YYYY-MM-DD",
   separator: " 至 ",
   applyLabel: "确定",
   cancelLabel: '取消',
   fromLabel: '起始时间',
   toLabel: '结束时间',
   customRangeLabel: '自定义',
   daysOfWeek: ['日', '一', '二', '三', '四', '五', '六'],
   monthNames: ['一月', '二月', '三月', '四月', '五月', '六月',
    '七月', '八月', '九月', '十月', '十一月', '十二月'],
   firstDay: 1
  },
 };

 constructor() {
 }

 /**
  * emit回调事件,获取选中时间
  * @param date
  */
 dateSelected(date) {
  this.date = date;
 }
}

另外注意,css需要另外单独打包,或html单独引用,如何打包css,请看最后,我这里是用webpack打包的

// 采用ExtractTextPlugin单独对jquery插件进行css打包
loaders: [{
    test: /daterangepicker\.css$/,
    loader: ExtractTextPlugin.extract('style-loader', 'css-loader')
   }]

plugins: [
     new ExtractTextPlugin('[name].css', {
      allChunks: true
     })]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 键盘keyCode键码值表
Dec 24 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
Jun 11 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
Mar 25 Javascript
IE8中动态创建script标签onload无效的解决方法
Dec 22 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
Feb 12 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
Feb 28 Javascript
JavaScript判断浏览器及其版本信息
Jan 20 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
Jul 02 Javascript
简易Vue评论框架的实现(父组件的实现)
Jan 08 Javascript
vue2.0.js的多级联动选择器实现方法
Feb 09 Javascript
JavaScript的console命令使用实例
Dec 03 Javascript
jQuery实现图片切换效果
Oct 19 jQuery
vue-router跳转页面的方法
Feb 09 #Javascript
基于JavaScript实现复选框的全选和取消全选
Feb 09 #Javascript
jquery.cookie.js的介绍与使用方法
Feb 09 #Javascript
js 数据存储和DOM编程
Feb 09 #Javascript
超全面的javascript中变量命名规则
Feb 09 #Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
Feb 09 #Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 #Javascript
You might like
菜鸟学PHP之Smarty入门
2007/01/04 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
javascript关于继承解析
2016/05/10 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
ElementUI Tag组件实现多标签生成的方法示例
2019/07/08 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
Python实现队列的方法
2015/05/26 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
师范生的个人求职信范文
2014/01/04 职场文书
2014年售票员工作总结
2014/11/19 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python
Redis特殊数据类型bitmap位图
2022/06/01 Redis