详解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 相关文章推荐
Prototype Selector对象学习
Jul 23 Javascript
A标签触发onclick事件而不跳转的多种解决方法
Jun 27 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
Aug 14 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
Sep 26 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
前端面试知识点锦集(JavaScript篇)
Dec 28 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
Feb 21 Javascript
基于jQuery实现无缝轮播与左右点击效果
May 13 jQuery
JS实现的冒泡排序,快速排序,插入排序算法示例
Mar 02 Javascript
vue项目首屏打开速度慢的解决方法
Mar 31 Javascript
VUEX-action可以修改state吗
Nov 19 Javascript
js实现简单的秒表
Jan 16 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
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
动态样式类封装JS代码
2009/09/02 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
python使用marshal模块序列化实例
2014/09/25 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python制作Windows系统服务
2017/03/25 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python中的json总结
2018/10/11 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
Django之路由层的实现
2019/09/09 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
财会自我鉴定范文
2013/12/27 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
一般纳税人申请报告
2015/05/18 职场文书
正确使用MySQL update语句
2021/05/26 MySQL