详解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 css styleFloat和cssFloat
Mar 15 Javascript
javascript 事件绑定问题
Jan 01 Javascript
扩展JavaScript功能的正确方法(译文)
Apr 12 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
jQuery+CSS3实现树叶飘落特效
Feb 01 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 Javascript
jQuery+css实现的切换图片功能代码
Jan 27 Javascript
jQuery表格的维护和删除操作
Feb 03 Javascript
JavaScript对象_动力节点Java学院整理
Jun 23 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
Koa 中的错误处理解析
Apr 09 Javascript
原生JS实现微信通讯录
Jun 18 Javascript
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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
微信小程序 如何获取网络状态
2019/07/26 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
使用C++扩展Python的功能详解
2018/01/12 Python
python实现Windows电脑定时关机
2018/06/20 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
python中如何使用insert函数
2020/01/09 Python
Python中pass的作用与使用教程
2020/11/13 Python
C语言基础笔试题
2013/04/27 面试题
演讲稿怎么写
2014/01/07 职场文书
给同学的道歉信
2014/01/16 职场文书
法律顾问服务方案
2014/05/15 职场文书
校长四风对照检查材料
2014/09/27 职场文书
继承权公证书范本
2015/01/23 职场文书
谢师宴邀请函
2015/02/02 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python