Angular 2 - 导入外部传单打字稿库
Angular 2 - import of external leaflet typescript library
我正在尝试将打字稿传单库导入我的 angular 2 应用程序。
这是我的地图组件。我已经使用 tsd install 安装了 leaflet.d.ts 并且我的应用程序没有抱怨 /// <reference path="../../typings/leaflet/leaflet.d.ts"/>
但是当我尝试使用 L.map 这是 leaflet.d.ts 中的导出模块时我得到错误 "ReferenceError: L is not defined"。这是我第一次尝试在 angular 2 中导入外部打字稿库,显然我做错了什么。
/// <reference path="../../typings/leaflet/leaflet.d.ts"/>
import { Component } from 'angular2/core';
@Component({
selector: 'map',
template: `
<div id="map"></div>
`,
})
export class Map{
constructor(){
var map = new L.Map('map', {
zoomControl: false
});
}
package.json
{
"dependencies": {
"angular2": "^2.0.0-beta.3",
"es6-promise": "^3.0.2",
"es6-shim": "^0.33.3",
"normalize.css": "^3.0.3",
"reflect-metadata": "0.1.2",
"rxjs": "5.0.0-beta.2",
"systemjs": "0.19.6",
"typings": "^0.6.4",
"zone.js": "^0.5.11"
},
"devDependencies": {
"concurrently": "^1.0.0",
"gh-pages": "^0.11.0",
"grunt": "~0.4.5",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-cssmin": "^1.0.0",
"grunt-contrib-nodeunit": "~0.4.1",
"grunt-contrib-sass": "~0.9.0",
"grunt-contrib-uglify": "~0.5.0",
"grunt-shell": "^1.2.1",
"lite-server": "^2.0.1",
"normalize.css": "^3.0.3",
"typescript": "^1.7.5"
},
"scripts": {
"publish": "node publish.js",
"tsc": "tsc",
"tsc:w": "tsc -w",
"lite": "lite-server",
"start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
}
}
tsd.json
{
"version": "v4",
"repo": "borisyankov/DefinitelyTyped",
"ref": "master",
"path": "typings",
"bundle": "typings/tsd.d.ts",
"installed": {
"leaflet/leaflet.d.ts": {
"commit": "1da639a106527e0c4010b354a1efe52a3059a291"
}
}
}
谁能告诉我我做错了什么?
谢谢!
您需要包含传单 JS 文件:
System.config({
map: {
leaflet: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/leaflet.js'
},
packages: {'app': {defaultExtension: 'ts'}}
});
System.import('app/main')
.then(null, console.error.bind(console));
然后你可以这样在你的模块中导入它:
import {Component, OnInit} from 'angular2/core';
import leaflet from 'leaflet';
看到这个 plunkr:http://plnkr.co/edit/aUo2uvlxC5ji32u01jfF?p=preview。
我可以建议您解决方法,直到 angular-cli 获得对第 3 方库的更好支持。它对我有用:)
首先进入项目目录并输入
npm install leaflet --save
然后打开你的 angular-cli-build.js 并添加这一行
vendorNpmFiles: [
..................
'leaflet/**/*.js',
....................
]
现在打开你的src/system-config.ts,写
const map:any ={
..................
'leaflet': 'vendor/leaflet/dist',
....................
}
和
const packages: any = {
'leaflet': {
format: 'cjs'
}
};
打开你的src/index.html,添加这个
<script type="text/javascript" src="vendor/leaflet/dist/leaflet.js"></script>
并且不要忘记添加 css 文件
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css" />
现在打开你想要使用 Leaflet 的组件
declare let L: any;
@Component({
moduleId: module.id,
selector: 'app-map',
templateUrl: 'map.component.html',
styleUrls: ['map.component.css']
})
export class MapComponent implements OnInit, AfterViewInit {
leafletMap: any;
ngAfterViewInit() {
this.leafletMap = L.map("map").setView([23.709921, 90.407143], 7);
}
}
多田!!您的地图已加载 :D
同时,everything you have to do正在呼叫
npm install @types/leaflet@latest --save
并在 index.html 中包含来源。
无需其他进口或申报。然后,导入看起来像
import {control, LatLng, layerGroup, LayerGroup, Map} from "leaflet";
此外,地图初始化应该在 ngOnInit()
中进行,构造函数的使用不符合逻辑。
我必须进行一些更改才能使 Thierry Templier 的回答能够使用 systemjs 和 Angular 2.4.
我按照他的说法将 Leaflet 添加到我的 system.config.js 文件中,但是在我的组件中我必须以这种方式导入它:
import * as L from 'leaflet';
然后 L class 在我的 MapComponent
中被识别
export class MapComponent {
let map = L.map("map").setView([38, -77], 13);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
}
我正在尝试将打字稿传单库导入我的 angular 2 应用程序。
这是我的地图组件。我已经使用 tsd install 安装了 leaflet.d.ts 并且我的应用程序没有抱怨 /// <reference path="../../typings/leaflet/leaflet.d.ts"/>
但是当我尝试使用 L.map 这是 leaflet.d.ts 中的导出模块时我得到错误 "ReferenceError: L is not defined"。这是我第一次尝试在 angular 2 中导入外部打字稿库,显然我做错了什么。
/// <reference path="../../typings/leaflet/leaflet.d.ts"/>
import { Component } from 'angular2/core';
@Component({
selector: 'map',
template: `
<div id="map"></div>
`,
})
export class Map{
constructor(){
var map = new L.Map('map', {
zoomControl: false
});
}
package.json
{
"dependencies": {
"angular2": "^2.0.0-beta.3",
"es6-promise": "^3.0.2",
"es6-shim": "^0.33.3",
"normalize.css": "^3.0.3",
"reflect-metadata": "0.1.2",
"rxjs": "5.0.0-beta.2",
"systemjs": "0.19.6",
"typings": "^0.6.4",
"zone.js": "^0.5.11"
},
"devDependencies": {
"concurrently": "^1.0.0",
"gh-pages": "^0.11.0",
"grunt": "~0.4.5",
"grunt-contrib-clean": "^1.0.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-cssmin": "^1.0.0",
"grunt-contrib-nodeunit": "~0.4.1",
"grunt-contrib-sass": "~0.9.0",
"grunt-contrib-uglify": "~0.5.0",
"grunt-shell": "^1.2.1",
"lite-server": "^2.0.1",
"normalize.css": "^3.0.3",
"typescript": "^1.7.5"
},
"scripts": {
"publish": "node publish.js",
"tsc": "tsc",
"tsc:w": "tsc -w",
"lite": "lite-server",
"start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
}
}
tsd.json
{
"version": "v4",
"repo": "borisyankov/DefinitelyTyped",
"ref": "master",
"path": "typings",
"bundle": "typings/tsd.d.ts",
"installed": {
"leaflet/leaflet.d.ts": {
"commit": "1da639a106527e0c4010b354a1efe52a3059a291"
}
}
}
谁能告诉我我做错了什么?
谢谢!
您需要包含传单 JS 文件:
System.config({
map: {
leaflet: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/leaflet.js'
},
packages: {'app': {defaultExtension: 'ts'}}
});
System.import('app/main')
.then(null, console.error.bind(console));
然后你可以这样在你的模块中导入它:
import {Component, OnInit} from 'angular2/core';
import leaflet from 'leaflet';
看到这个 plunkr:http://plnkr.co/edit/aUo2uvlxC5ji32u01jfF?p=preview。
我可以建议您解决方法,直到 angular-cli 获得对第 3 方库的更好支持。它对我有用:)
首先进入项目目录并输入
npm install leaflet --save
然后打开你的 angular-cli-build.js 并添加这一行
vendorNpmFiles: [
..................
'leaflet/**/*.js',
....................
]
现在打开你的src/system-config.ts,写
const map:any ={
..................
'leaflet': 'vendor/leaflet/dist',
....................
}
和
const packages: any = {
'leaflet': {
format: 'cjs'
}
};
打开你的src/index.html,添加这个
<script type="text/javascript" src="vendor/leaflet/dist/leaflet.js"></script>
并且不要忘记添加 css 文件
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css" />
现在打开你想要使用 Leaflet 的组件
declare let L: any;
@Component({
moduleId: module.id,
selector: 'app-map',
templateUrl: 'map.component.html',
styleUrls: ['map.component.css']
})
export class MapComponent implements OnInit, AfterViewInit {
leafletMap: any;
ngAfterViewInit() {
this.leafletMap = L.map("map").setView([23.709921, 90.407143], 7);
}
}
多田!!您的地图已加载 :D
同时,everything you have to do正在呼叫
npm install @types/leaflet@latest --save
并在 index.html 中包含来源。
无需其他进口或申报。然后,导入看起来像
import {control, LatLng, layerGroup, LayerGroup, Map} from "leaflet";
此外,地图初始化应该在 ngOnInit()
中进行,构造函数的使用不符合逻辑。
我必须进行一些更改才能使 Thierry Templier 的回答能够使用 systemjs 和 Angular 2.4.
我按照他的说法将 Leaflet 添加到我的 system.config.js 文件中,但是在我的组件中我必须以这种方式导入它:
import * as L from 'leaflet';
然后 L class 在我的 MapComponent
中被识别export class MapComponent {
let map = L.map("map").setView([38, -77], 13);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
}