本文全部内容以 Angular 2 Quick Start 项目为基础,使用 TypeScript 语言。html
如上图,最近遇到一个需求,须要在一个刚启动的 Angular 2 项目中使用 snap.svg 操做页面上的 svg 元素作动画。nginx
我粗略的看了下, snap.svg 的实现彷佛并无听从什么模块规范,就是常见的提供几个全局变量完事。若是真的耿直的在 Component 中去用的话,会在执行 tsc 编译成 js 文件这一过程当中报错。git
这是由于 TypeScript 编译器并不知道 snap.svg.js 提供了怎样的接口,因此当 ts 代码中出现了 Snap()
时,编译器会认为咱们调用了一个不存在的方法而报错。解决方式也很简单,只须要使用 declare 告知 TypeScript 编译器这个方法是在别处建立的,没有出错不用紧张:-)github
简单的方法
-
bower 或直接下载 snap.svg.js 文件。typescript
-
在 index.html 中引入这个 js 文件。app
-
在 app.component.js 上方加上这段声明:
declare var Snap: any, mina: any;
svg -
照常使用便可svn
可是 Angular 2 的其余模块都是动态加载的,这里写死在 index.html 就感受有点弱逼,因此下一步是配置 SystemJS ,而后用它来加载 snap.svg 。动画
用上 SystemJS
若是你和我这里同样,是以 Angular 2 Quick Start 项目为基础,那么你的 SystemJS 配置文件就是项目文件夹下的 systemjs.config.js ,最简的配置只须要添加一行:ui
var map = { ... 'snap-svg': 'third-party/snap.svg-min.js', // 添加此行便可 };
你的文件名与路径可能跟我不一样,右侧是相对于项目文件夹的相对路径,看状况修改便可。
这样一来,咱们就能够和 Angular 2 的其它组件同样动态加载 snap.svg 了。
import { Component } from '@angular/core';
Angular 2 的官方文档里,常常能看到上面这种 import 形式。如前文所述, snap.svg 提供的交互方式是全局变量,那么咱们的 import 语句还比上面的更简单,最后是这个样子的:
import 'snap-svn'; // 1. 加载 snap.svg declare var Snap: any, // 2. 消除 tsc 编译器报错 mina: any; ... var wave = Snap(this.el.querySelector('#wave')); // 3. 在 Component 中使用 snap.svg wave.animate({ transform: waveOverTrans }, 1500, mina.backout); ...