详解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 相关文章推荐
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
javascript控制frame,iframe的src属性代码
Dec 31 Javascript
复制js对象方法(详解)
Jul 08 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
jQuery浏览器CSS3特写兼容实例
Jan 19 Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 Javascript
使用jQuery操作HTML的table表格的实例解析
Mar 13 Javascript
jQuery原理系列-常用Dom操作详解
Jun 07 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
AngularJS中下拉框的基本用法示例
Oct 11 Javascript
a标签调用js的方法总结
Sep 05 Javascript
node.js开发辅助工具nodemon安装与配置详解
Feb 06 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
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
PHP生成器简单实例
2015/05/13 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
js 调用百度分享功能
2017/02/27 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
vue 组件使用中的一些细节点
2018/04/25 Javascript
Vue实现简单分页器
2018/12/29 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
python实现周期方波信号频谱图
2018/07/21 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
英国Lookfantastic中文网站:护肤品美妆美发购物(英国直邮)
2020/04/27 全球购物
办公室人员先进事迹
2014/01/27 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
Python实现信息管理系统
2022/06/05 Python