angular2采用自定義指令(Directive)方式加載jquery插件


由於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
         })]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM