详解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类和继承 constructor属性
Mar 04 Javascript
javascript 隔行换色函数代码
Oct 24 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
Dec 12 Javascript
jquery表格内容筛选实现思路及代码
Apr 16 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
Node.js中调用mysql存储过程示例
Dec 20 Javascript
js改变Iframe中Src的方法
May 05 Javascript
jQuery实现带滑动条的菜单效果代码
Aug 26 Javascript
JavaScript中绑定事件的三种方式及去除绑定
Nov 05 Javascript
浅谈键盘上回车按钮的js触发事件
Feb 13 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
Apr 18 Javascript
layui--js控制switch的切换方法
Sep 03 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 checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
php实现word转html的方法
2016/01/22 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
Python生成pdf文件的方法
2014/08/04 Python
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
python 将Excel转Word的示例
2021/03/02 Python
三星英国官网:Samsung英国
2018/09/25 全球购物
计算机通信专业推荐信
2014/02/22 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
旅游节目策划方案
2014/05/26 职场文书
支部鉴定材料
2014/06/02 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
教师节主持词开场白
2015/05/29 职场文书
可怜妈妈观后感
2015/06/09 职场文书
卖车协议书范文
2016/03/23 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA