详解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 相关文章推荐
json-lib出现There is a cycle in the hierarchy解决办法
Feb 24 Javascript
javascript 四则运算精度修正函数代码
May 31 Javascript
关于jquery动态增减控件的一些想法和小插件
Aug 01 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
javascript 判断一个对象为数组的方法
May 03 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
Mar 06 Javascript
vue2.0 实现导航守卫(路由守卫)
May 21 Javascript
JS阻止事件冒泡的方法详解
Aug 26 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
Jul 24 Javascript
vue 插槽简介及使用示例
Nov 19 Vue.js
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项目的方法
2006/10/09 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
2013/07/08 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
很不错的两款Bootstrap Icon图标选择组件
2016/01/28 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
python 输出所有大小写字母的方法
2019/01/02 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
Python for循环与getitem的关系详解
2020/01/02 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
技术副厂长岗位职责
2013/12/26 职场文书
小学生家长评语集锦
2014/01/30 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
会计学自我鉴定
2014/02/06 职场文书
骨干教师培训方案
2014/05/06 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
支教个人总结
2015/03/04 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书