详解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 相关文章推荐
异步动态加载js与css文件的js代码
Sep 15 Javascript
jquery 页面滚动到指定DIV实现代码
Sep 25 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
Dec 23 Javascript
Js与下拉列表处理问题解决
Feb 13 Javascript
jQuery中fadeOut()方法用法实例
Dec 24 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
浅谈javascript中遇到的字符串对象处理
Nov 18 Javascript
JS中如何实现Laravel的route函数详解
Feb 12 Javascript
实例讲解vue源码架构
Jan 24 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
Jun 03 Javascript
js简单的分页器插件代码实例
Sep 11 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
Jun 23 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
yii中widget的用法
2014/12/03 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python文件及目录操作实例详解
2015/06/04 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
django 实现简单的插入视频
2020/04/07 Python
python利用platform模块获取系统信息
2020/10/09 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
台湾旅游网站:灿星旅游
2018/10/11 全球购物
建筑结构施工专业推荐信
2014/02/21 职场文书
爱国演讲稿500字
2014/05/04 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
nginx请求限制配置方法
2021/07/09 Servers