(docs) getting started evolved with some unit-tests for quickstart
This commit is contained in:
parent
50e758ba60
commit
c44e966278
|
@ -1,4 +1,8 @@
|
||||||
node_modules
|
node_modules
|
||||||
|
bower_components
|
||||||
|
jspm_packages
|
||||||
|
typings
|
||||||
|
*.map
|
||||||
www
|
www
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea
|
.idea
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
src/**/*.js
|
|
@ -0,0 +1,10 @@
|
||||||
|
#Getting Started (TS) for the DevGuide developer
|
||||||
|
|
||||||
|
This is the source code for the "Getting Started" Typescrip example code.
|
||||||
|
|
||||||
|
There are files here that are *for the audience* and **not to be executed during example development**!
|
||||||
|
|
||||||
|
* **package.json** - as the audience will see it; the example reaches up to the site level **node_modules**
|
||||||
|
and the scripts are not supposed to work here.
|
||||||
|
|
||||||
|
* **tsd.json** - as the audience will see it; the example reaches up to the example level typings
|
|
@ -1,37 +0,0 @@
|
||||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
||||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") return Reflect.decorate(decorators, target, key, desc);
|
|
||||||
switch (arguments.length) {
|
|
||||||
case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
|
|
||||||
case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);
|
|
||||||
case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
||||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
||||||
};
|
|
||||||
// #docregion
|
|
||||||
// #docregion import
|
|
||||||
var angular2_1 = require('angular2/angular2');
|
|
||||||
// #enddocregion
|
|
||||||
// #docregion class-w-annotations
|
|
||||||
var AppComponent = (function () {
|
|
||||||
function AppComponent() {
|
|
||||||
}
|
|
||||||
AppComponent = __decorate([
|
|
||||||
angular2_1.Component({
|
|
||||||
selector: 'my-app'
|
|
||||||
}),
|
|
||||||
angular2_1.View({
|
|
||||||
template: '<h1 id="output">My First Angular 2 App</h1>'
|
|
||||||
}),
|
|
||||||
__metadata('design:paramtypes', [])
|
|
||||||
], AppComponent);
|
|
||||||
return AppComponent;
|
|
||||||
})();
|
|
||||||
// #enddocregion
|
|
||||||
// #enddocregion
|
|
||||||
// #docregion bootstrap
|
|
||||||
angular2_1.bootstrap(AppComponent);
|
|
||||||
// #enddocregion
|
|
||||||
// #enddocregion
|
|
||||||
//# sourceMappingURL=app.js.map
|
|
|
@ -1,15 +0,0 @@
|
||||||
<!-- #docregion -->
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<script src="https://github.jspm.io/jmcriffey/bower-traceur-runtime@0.0.87/traceur-runtime.js"></script>
|
|
||||||
<script src="https://jspm.io/system@0.16.js"></script>
|
|
||||||
<script src="https://code.angularjs.org/2.0.0-alpha.34/angular2.dev.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<my-app></my-app>
|
|
||||||
<script>
|
|
||||||
System.import('app');
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "ng2-getting-started",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"dependencies": {
|
||||||
|
"angular2": "2.0.0-alpha.35",
|
||||||
|
"es6-module-loader": "^0.16",
|
||||||
|
"systemjs": "^0.16",
|
||||||
|
"traceur": "0.0.91"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"postinstall": "cd src && tsd reinstall -r -o && cd ..",
|
||||||
|
"tsc": "tsc -p src -w",
|
||||||
|
"start": "live-server --open=src"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!-- #docregion -->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="../node_modules/traceur/bin/traceur-runtime.js"></script>
|
||||||
|
<script src="../node_modules/es6-module-loader/dist/es6-module-loader.js"></script>
|
||||||
|
<script src="../node_modules/systemjs/dist/system.src.js"></script>
|
||||||
|
<script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<my-app></my-app>
|
||||||
|
<script>
|
||||||
|
System.import('app');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES5",
|
||||||
|
"module": "commonjs",
|
||||||
|
"sourceMap": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"version": "v4",
|
||||||
|
"repo": "borisyankov/DefinitelyTyped",
|
||||||
|
"ref": "master",
|
||||||
|
"path": "typings",
|
||||||
|
"bundle": "typings/tsd.d.ts",
|
||||||
|
"installed": {
|
||||||
|
"angular2/angular2.d.ts": {
|
||||||
|
"commit": "cd2e71bb1f0459197e733be66fdeafaec600514d"
|
||||||
|
},
|
||||||
|
"es6-promise/es6-promise.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
},
|
||||||
|
"jasmine/jasmine.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
},
|
||||||
|
"rx/rx.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
},
|
||||||
|
"rx/rx-lite.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
src/**/*.js
|
|
@ -1,34 +0,0 @@
|
||||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
||||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") return Reflect.decorate(decorators, target, key, desc);
|
|
||||||
switch (arguments.length) {
|
|
||||||
case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);
|
|
||||||
case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);
|
|
||||||
case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
||||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
||||||
};
|
|
||||||
// #docregion
|
|
||||||
// #docregion import
|
|
||||||
var angular2_1 = require('angular2/angular2');
|
|
||||||
// #enddocregion
|
|
||||||
var MyAppComponent = (function () {
|
|
||||||
function MyAppComponent() {
|
|
||||||
this.name = 'Alice';
|
|
||||||
}
|
|
||||||
MyAppComponent = __decorate([
|
|
||||||
angular2_1.Component({
|
|
||||||
selector: 'my-app'
|
|
||||||
}),
|
|
||||||
angular2_1.View({
|
|
||||||
template: '<h1 id="output">Hello {{ name }}</h1>'
|
|
||||||
}),
|
|
||||||
__metadata('design:paramtypes', [])
|
|
||||||
], MyAppComponent);
|
|
||||||
return MyAppComponent;
|
|
||||||
})();
|
|
||||||
// #docregion bootstrap
|
|
||||||
angular2_1.bootstrap(MyAppComponent);
|
|
||||||
// #enddocregion
|
|
||||||
//# sourceMappingURL=app.js.map
|
|
|
@ -1 +0,0 @@
|
||||||
{"version":3,"file":"app.js","sourceRoot":"","sources":["app.ts"],"names":["MyAppComponent","MyAppComponent.constructor"],"mappings":";;;;;;;;;;;AAEA,AAFA,aAAa;AACb,oBAAoB;AACpB,yBAAyC,mBAAmB,CAAC,CAAA;AAG7D,AAFA,gBAAgB;;IAWfA;QACCC,IAAIA,CAACA,IAAIA,GAAGA,OAAOA,CAACA;IACrBA,CAACA;IAXFD;QAACA,oBAASA,CAACA;YACVA,QAAQA,EAAEA,QAAQA;SAClBA,CAACA;QACDA,eAAIA,CAACA;YACLA,QAAQA,EAAEA,uCAAuCA;SACjDA,CAACA;;uBAODA;IAADA,qBAACA;AAADA,CAACA,AAZD,IAYC;AAGD,AADA,uBAAuB;AACvB,oBAAS,CAAC,cAAc,CAAC,CAAC;AAC1B,gBAAgB"}
|
|
|
@ -3,13 +3,14 @@
|
||||||
<head>
|
<head>
|
||||||
<!-- #docregion head -->
|
<!-- #docregion head -->
|
||||||
<title>Angular 2 Quickstart</title>
|
<title>Angular 2 Quickstart</title>
|
||||||
<script src="https://github.jspm.io/jmcriffey/bower-traceur-runtime@0.0.87/traceur-runtime.js"></script>
|
<script src="node_modules/traceur/bin/traceur-runtime.js"></script>
|
||||||
<script src="https://jspm.io/system@0.16.js"></script>
|
<script src="node_modules/es6-module-loader/dist/es6-module-loader.js"></script>
|
||||||
<script src="https://code.angularjs.org/2.0.0-alpha.28/angular2.dev.js"></script>
|
<script src="node_modules/systemjs/dist/system.src.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
|
||||||
<!-- #enddocregion -->
|
<!-- #enddocregion -->
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<my-app></my-app>
|
<app></app>
|
||||||
<script>System.import('app');</script>
|
<script>System.import('src/app');</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"name": "ng2-quickstart",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"license": "ICS",
|
||||||
|
"repository": {},
|
||||||
|
"dependencies": {
|
||||||
|
"angular2": "2.0.0-alpha.35",
|
||||||
|
"es6-module-loader": "^0.16",
|
||||||
|
"systemjs": "^0.16",
|
||||||
|
"traceur": "0.0.91"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"jasmine-core": "^2.3.4",
|
||||||
|
"zone.js": "^0.5.3"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"postinstall": "cd src && tsd reinstall -r -o && cd ..",
|
||||||
|
"tsc": "tsc -p src -w",
|
||||||
|
"start": "live-server"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
///// Boiler Plate ////
|
||||||
|
import {bind} from 'angular2/angular2';
|
||||||
|
|
||||||
|
import {
|
||||||
|
beforeEachBindings, DebugElement, RootTestComponent as RTC,
|
||||||
|
// Jasmine overrides
|
||||||
|
beforeEach, ddescribe, xdescribe, describe, iit, it, xit, //expect,
|
||||||
|
AsyncTestCompleter, inject, RootTestComponent, TestComponentBuilder,
|
||||||
|
} from 'angular2/test';
|
||||||
|
|
||||||
|
//// Testing this component ////
|
||||||
|
import {AppComponent} from './app';
|
||||||
|
|
||||||
|
describe('AppComponent', () => {
|
||||||
|
|
||||||
|
describe('(no DOM)', () => {
|
||||||
|
|
||||||
|
it('component has name == "Alice"', () => {
|
||||||
|
let app = new AppComponent;
|
||||||
|
expect(app.name).toEqual('Alice');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('(in DOM)', () => {
|
||||||
|
|
||||||
|
it('component has name == "Alice"', injectTcb((tcb, done) => {
|
||||||
|
tcb
|
||||||
|
.createAsync(AppComponent)
|
||||||
|
.then((rootTC:RTC) => {
|
||||||
|
let ac:AppComponent = rootTC.componentInstance;
|
||||||
|
expect(ac.name).toEqual('Alice');
|
||||||
|
})
|
||||||
|
.catch(fail).then(done,done);
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('DOM has name == "Alice"', injectTcb((tcb, done) => {
|
||||||
|
tcb
|
||||||
|
.createAsync(AppComponent)
|
||||||
|
.then((rootTC:RTC) => {
|
||||||
|
rootTC.detectChanges();
|
||||||
|
let domName = rootTC.componentViewChildren[0].nativeElement.innerHTML;
|
||||||
|
expect(domName).toMatch('Alice');
|
||||||
|
})
|
||||||
|
.catch(fail).then(done,done);
|
||||||
|
}));
|
||||||
|
//rootTC.nativeElement.getElementsByTagName('h1')[0].innerHTML
|
||||||
|
it('DOM has name == "Alice" (2)', injectTcb((tcb, done) => {
|
||||||
|
tcb
|
||||||
|
.createAsync(AppComponent)
|
||||||
|
.then((rootTC:RTC) => {
|
||||||
|
rootTC.detectChanges();
|
||||||
|
let domName = rootTC.nativeElement
|
||||||
|
// jQuery goes here
|
||||||
|
.getElementsByTagName('h1')[0].innerHTML;
|
||||||
|
expect(domName).toMatch('Alice');
|
||||||
|
})
|
||||||
|
.catch(fail).then(done,done);
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
///////// test.helpers.ts: here for now ////////
|
||||||
|
|
||||||
|
function injectTcb(testFn: (tcb: TestComponentBuilder, done: ()=>void) => void) {
|
||||||
|
return inject([TestComponentBuilder, AsyncTestCompleter], function injectWrapper(tcb: TestComponentBuilder, async: AsyncTestCompleter) {
|
||||||
|
testFn(tcb, async.done.bind(async));
|
||||||
|
});
|
||||||
|
}
|
|
@ -4,12 +4,12 @@ import {Component, View, bootstrap} from 'angular2/angular2';
|
||||||
// #enddocregion
|
// #enddocregion
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-app'
|
selector: 'app'
|
||||||
})
|
})
|
||||||
@View({
|
@View({
|
||||||
template: '<h1 id="output">Hello {{ name }}</h1>'
|
template: '<h1 id="output">Hello {{ name }}</h1>'
|
||||||
})
|
})
|
||||||
class MyAppComponent {
|
export class AppComponent {
|
||||||
name : string;
|
name : string;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -18,5 +18,5 @@ class MyAppComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
// #docregion bootstrap
|
// #docregion bootstrap
|
||||||
bootstrap(MyAppComponent);
|
bootstrap(AppComponent);
|
||||||
// #enddocregion
|
// #enddocregion
|
|
@ -0,0 +1,9 @@
|
||||||
|
describe("Jasmine sample test", function() {
|
||||||
|
|
||||||
|
it("1+1 should be 2", function() {
|
||||||
|
|
||||||
|
var result = 1 + 1;
|
||||||
|
|
||||||
|
expect(result).toBe(2);
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES5",
|
||||||
|
"module": "commonjs",
|
||||||
|
"sourceMap": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"version": "v4",
|
||||||
|
"repo": "borisyankov/DefinitelyTyped",
|
||||||
|
"ref": "master",
|
||||||
|
"path": "typings",
|
||||||
|
"bundle": "typings/tsd.d.ts",
|
||||||
|
"installed": {
|
||||||
|
"angular2/angular2.d.ts": {
|
||||||
|
"commit": "cd2e71bb1f0459197e733be66fdeafaec600514d"
|
||||||
|
},
|
||||||
|
"es6-promise/es6-promise.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
},
|
||||||
|
"jasmine/jasmine.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
},
|
||||||
|
"rx/rx.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
},
|
||||||
|
"rx/rx-lite.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
<!-- #docregion -->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
||||||
|
<title>QuickStart Tests</title>
|
||||||
|
<link rel="stylesheet" href="node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
|
||||||
|
|
||||||
|
<script src="node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
|
||||||
|
<script src="node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
|
||||||
|
<script src="node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
|
||||||
|
|
||||||
|
<script src="node_modules/traceur/bin/traceur-runtime.js"></script>
|
||||||
|
<script src="node_modules/es6-module-loader/dist/es6-module-loader.src.js"></script>
|
||||||
|
<script src="node_modules/systemjs/dist/system.src.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/http.dev.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/test_lib.dev.js"></script>
|
||||||
|
<script src="node_modules/zone.js/dist/long-stack-trace-zone.js"></script>
|
||||||
|
<script src="node_modules/zone.js/dist/jasmine-patch.js"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<app><!--placeholder--></app>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
Error.stackTraceLimit=Infinity;
|
||||||
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 100;
|
||||||
|
|
||||||
|
var imports = [
|
||||||
|
'src/dummy.spec',
|
||||||
|
'src/app.spec',
|
||||||
|
'@empty' // placeholder makes it easier to comment-out specs above
|
||||||
|
].map(System.import.bind(System));
|
||||||
|
|
||||||
|
Promise.all(imports)
|
||||||
|
.then( function() {
|
||||||
|
// Must designate a BrowserDomAdapter or else DOM testing bombs
|
||||||
|
// (e.g. when testing component and call `tcb.createAsync`) for lack of `DOM` object
|
||||||
|
// Igor's recommended approach based on
|
||||||
|
// https://github.com/angular/angular/blob/master/test-main.js
|
||||||
|
//
|
||||||
|
// TODO: BrowserDomAdapter should be exposed through 'angular2/test' instead
|
||||||
|
var DomAdapterModule = System.get('angular2/src/dom/browser_adapter');
|
||||||
|
if (DomAdapterModule) {
|
||||||
|
DomAdapterModule.BrowserDomAdapter.makeCurrent();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then( function() { window.onload();} ) // re-execute Jasmine's buildup
|
||||||
|
.catch( function(err) { console.log(err);} );
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES5",
|
"target": "ES5",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"emitDecoratorMetadata": true,
|
"emitDecoratorMetadata": true,
|
||||||
"experimentalDecorators": true
|
"experimentalDecorators": true
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,20 +5,20 @@
|
||||||
"path": "typings",
|
"path": "typings",
|
||||||
"bundle": "typings/tsd.d.ts",
|
"bundle": "typings/tsd.d.ts",
|
||||||
"installed": {
|
"installed": {
|
||||||
|
"angular2/angular2.d.ts": {
|
||||||
|
"commit": "cd2e71bb1f0459197e733be66fdeafaec600514d"
|
||||||
|
},
|
||||||
"es6-promise/es6-promise.d.ts": {
|
"es6-promise/es6-promise.d.ts": {
|
||||||
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
|
},
|
||||||
|
"jasmine/jasmine.d.ts": {
|
||||||
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
},
|
},
|
||||||
"rx/rx.d.ts": {
|
"rx/rx.d.ts": {
|
||||||
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
},
|
},
|
||||||
"rx/rx-lite.d.ts": {
|
"rx/rx-lite.d.ts": {
|
||||||
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
||||||
},
|
|
||||||
"angular2/angular2.d.ts": {
|
|
||||||
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
|
||||||
},
|
|
||||||
"jasmine/jasmine.d.ts": {
|
|
||||||
"commit": "71d072b7354936b88d57c2029042d2da7c6ec0e7"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
```
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<script src="https://github.jspm.io/jmcriffey/bower-traceur-runtime@0.0.87/traceur-runtime.js"></script>
|
|
||||||
<script src="https://jspm.io/system@0.16.js"></script>
|
|
||||||
<script src="https://code.angularjs.org/2.0.0-alpha.34/angular2.dev.js"></script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<my-app></my-app>
|
|
||||||
<script>
|
|
||||||
System.import('app');
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
```
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
```
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="../node_modules/traceur/bin/traceur-runtime.js"></script>
|
||||||
|
<script src="../node_modules/es6-module-loader/dist/es6-module-loader.js"></script>
|
||||||
|
<script src="../node_modules/systemjs/dist/system.src.js"></script>
|
||||||
|
<script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<my-app></my-app>
|
||||||
|
<script>
|
||||||
|
System.import('app');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
```
|
|
@ -1,3 +0,0 @@
|
||||||
```
|
|
||||||
angular2_1.bootstrap(MyAppComponent);
|
|
||||||
```
|
|
|
@ -1,3 +0,0 @@
|
||||||
```
|
|
||||||
bootstrap(MyAppComponent);
|
|
||||||
```
|
|
|
@ -1,3 +0,0 @@
|
||||||
```
|
|
||||||
var angular2_1 = require('angular2/angular2');
|
|
||||||
```
|
|
|
@ -1,20 +0,0 @@
|
||||||
```
|
|
||||||
var angular2_1 = require('angular2/angular2');
|
|
||||||
var MyAppComponent = (function () {
|
|
||||||
function MyAppComponent() {
|
|
||||||
this.name = 'Alice';
|
|
||||||
}
|
|
||||||
MyAppComponent = __decorate([
|
|
||||||
angular2_1.Component({
|
|
||||||
selector: 'my-app'
|
|
||||||
}),
|
|
||||||
angular2_1.View({
|
|
||||||
template: '<h1 id="output">Hello {{ name }}</h1>'
|
|
||||||
}),
|
|
||||||
__metadata('design:paramtypes', [])
|
|
||||||
], MyAppComponent);
|
|
||||||
return MyAppComponent;
|
|
||||||
})();
|
|
||||||
angular2_1.bootstrap(MyAppComponent);
|
|
||||||
//# sourceMappingURL=app.js.map
|
|
||||||
```
|
|
|
@ -1,6 +1,7 @@
|
||||||
```
|
```
|
||||||
<title>Angular 2 Quickstart</title>
|
<title>Angular 2 Quickstart</title>
|
||||||
<script src="https://github.jspm.io/jmcriffey/bower-traceur-runtime@0.0.87/traceur-runtime.js"></script>
|
<script src="node_modules/traceur/bin/traceur-runtime.js"></script>
|
||||||
<script src="https://jspm.io/system@0.16.js"></script>
|
<script src="node_modules/es6-module-loader/dist/es6-module-loader.js"></script>
|
||||||
<script src="https://code.angularjs.org/2.0.0-alpha.28/angular2.dev.js"></script>
|
<script src="node_modules/systemjs/dist/system.src.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
|
||||||
```
|
```
|
|
@ -2,13 +2,14 @@
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Angular 2 Quickstart</title>
|
<title>Angular 2 Quickstart</title>
|
||||||
<script src="https://github.jspm.io/jmcriffey/bower-traceur-runtime@0.0.87/traceur-runtime.js"></script>
|
<script src="node_modules/traceur/bin/traceur-runtime.js"></script>
|
||||||
<script src="https://jspm.io/system@0.16.js"></script>
|
<script src="node_modules/es6-module-loader/dist/es6-module-loader.js"></script>
|
||||||
<script src="https://code.angularjs.org/2.0.0-alpha.28/angular2.dev.js"></script>
|
<script src="node_modules/systemjs/dist/system.src.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<my-app></my-app>
|
<app></app>
|
||||||
<script>System.import('app');</script>
|
<script>System.import('src/app');</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
|
@ -0,0 +1,3 @@
|
||||||
|
```
|
||||||
|
bootstrap(AppComponent);
|
||||||
|
```
|
|
@ -2,12 +2,12 @@
|
||||||
import {Component, View, bootstrap} from 'angular2/angular2';
|
import {Component, View, bootstrap} from 'angular2/angular2';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'my-app'
|
selector: 'app'
|
||||||
})
|
})
|
||||||
@View({
|
@View({
|
||||||
template: '<h1 id="output">Hello {{ name }}</h1>'
|
template: '<h1 id="output">Hello {{ name }}</h1>'
|
||||||
})
|
})
|
||||||
class MyAppComponent {
|
export class AppComponent {
|
||||||
name : string;
|
name : string;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -15,6 +15,6 @@ class MyAppComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bootstrap(MyAppComponent);
|
bootstrap(AppComponent);
|
||||||
|
|
||||||
```
|
```
|
|
@ -0,0 +1,56 @@
|
||||||
|
```
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
||||||
|
<title>QuickStart Tests</title>
|
||||||
|
<link rel="stylesheet" href="node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
|
||||||
|
|
||||||
|
<script src="node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
|
||||||
|
<script src="node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
|
||||||
|
<script src="node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
|
||||||
|
|
||||||
|
<script src="node_modules/traceur/bin/traceur-runtime.js"></script>
|
||||||
|
<script src="node_modules/es6-module-loader/dist/es6-module-loader.src.js"></script>
|
||||||
|
<script src="node_modules/systemjs/dist/system.src.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/http.dev.js"></script>
|
||||||
|
<script src="node_modules/angular2/bundles/test_lib.dev.js"></script>
|
||||||
|
<script src="node_modules/zone.js/dist/long-stack-trace-zone.js"></script>
|
||||||
|
<script src="node_modules/zone.js/dist/jasmine-patch.js"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<app><!--placeholder--></app>
|
||||||
|
<script>
|
||||||
|
(function() {
|
||||||
|
Error.stackTraceLimit=Infinity;
|
||||||
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 100;
|
||||||
|
|
||||||
|
var imports = [
|
||||||
|
'src/dummy.spec',
|
||||||
|
'src/app.spec',
|
||||||
|
'@empty' // placeholder makes it easier to comment-out specs above
|
||||||
|
].map(System.import.bind(System));
|
||||||
|
|
||||||
|
Promise.all(imports)
|
||||||
|
.then( function() {
|
||||||
|
// Must designate a BrowserDomAdapter or else DOM testing bombs
|
||||||
|
// (e.g. when testing component and call `tcb.createAsync`) for lack of `DOM` object
|
||||||
|
// Igor's recommended approach based on
|
||||||
|
// https://github.com/angular/angular/blob/master/test-main.js
|
||||||
|
//
|
||||||
|
// TODO: BrowserDomAdapter should be exposed through 'angular2/test' instead
|
||||||
|
var DomAdapterModule = System.get('angular2/src/dom/browser_adapter');
|
||||||
|
if (DomAdapterModule) {
|
||||||
|
DomAdapterModule.BrowserDomAdapter.makeCurrent();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then( function() { window.onload();} ) // re-execute Jasmine's buildup
|
||||||
|
.catch( function(err) { console.log(err);} );
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
```
|
|
@ -1,130 +1,200 @@
|
||||||
include ../_util-fns
|
include ../../../../_includes/_util-fns
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
Let's start from zero and build a simple Angular 2 application in JavaScript.
|
||||||
|
|
||||||
|
.callout.is-helpful
|
||||||
|
header Don't want JavaScript?
|
||||||
|
:markdown
|
||||||
|
Although we're getting started in JavaScript, you can also write Angular 2 apps
|
||||||
|
in TypeScript and Dart by selecting either of those languages from the combo-box in the banner.
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
We'll do it in four short steps
|
||||||
|
1. Create a new project folder and an *index.html*
|
||||||
|
1. Write the root component for our application in *app.js*
|
||||||
|
1. Bootstrap the app
|
||||||
|
1. Run it
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
## Install Angular2
|
## Create a project folder and an *index.html*
|
||||||
There are four steps to create any Angular app:
|
|
||||||
|
|
||||||
1. Create an entry point HTML file where users will start
|
Create a new folder to hold our application project, perhaps like this:
|
||||||
1. Load the Angular library at the top of the file
|
|
||||||
1. Make a root component for your application
|
|
||||||
1. Bootstrap Angular
|
|
||||||
|
|
||||||
You can edit and test out your apps by serving local files with a web server. Follow the steps in the <a href="../quickstart.html">quickstart</a> to get Typescript setup.
|
|
||||||
|
|
||||||
If you don't already have an HTTP server, you can install one using <code>npm install -g http-server</code>. (If that results in an access error, then you might need to use <code><b>sudo</b> npm ...</code>.)
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
pre.prettyprint.lang-bash
|
pre.prettyprint.lang-bash
|
||||||
code.
|
code mkdir firstNgApp && cd firstNgApp
|
||||||
# From the directory that contains index.html:
|
|
||||||
npm install -g http-server # Or sudo npm install -g http-server
|
|
||||||
http-server # Creates a server at localhost:8080
|
|
||||||
# In a browser, visit localhost:8080/index.html
|
|
||||||
|
|
||||||
.callout.is-helpful
|
|
||||||
header Typescript vs ES5
|
|
||||||
:markdown
|
:markdown
|
||||||
Although we work through the examples in TypeScript, you can also use
|
Then add a new `index.html` file to the project folder and enter the following HTML
|
||||||
regular ES5. Click the ES5 link in any code box to see the ES5 JavaScript
|
|
||||||
version. Note that in ES5, you'd want to name your files `.js` rather than
|
|
||||||
`.ts`.
|
|
||||||
|
|
||||||
.l-main-section
|
+makeExample('gettingstarted', 'js/index.html', 'index.html')(format="")
|
||||||
:markdown
|
|
||||||
## Create an entry point
|
|
||||||
Create an `index.html` file and add the Angular library tags and a `main.ts` file where
|
|
||||||
you'll build your first component.
|
|
||||||
|
|
||||||
In the `<body>`, add an element called `<my-app>` that will be the root of your
|
.l-sub-section
|
||||||
application.
|
|
||||||
|
|
||||||
The TypeScript setup includes System.js, a third-party open-source library that adds ES6 module loading functionality to browsers. This step isn't needed for the ES5 version.
|
|
||||||
|
|
||||||
- var tsStyles = { pnk: [ /script (src=.*quot)/g, /System\.(import)/g] }
|
|
||||||
- var jsStyles = { otl: /script src=(".*")/g }
|
|
||||||
+makeTabs('gettingstarted', 'ts/index.html,js/index.html', 'TypeScript, JavaScript', [ tsStyles, jsStyles ])
|
|
||||||
|
|
||||||
.callout.is-helpful
|
|
||||||
header Don't use code.angularjs.org in a live app
|
|
||||||
:markdown
|
|
||||||
This example serves the Angular library from <a href="http://code.angularjs.org">code.angularjs.org</a>. This is
|
|
||||||
fine for examples, but you'd want to serve it yourself or use a CDN for real deployment.
|
|
||||||
|
|
||||||
.l-main-section
|
|
||||||
:markdown
|
|
||||||
## Set up the starting component
|
|
||||||
|
|
||||||
In `main.ts`, create a class called `AppComponent`, configure it to bind to the
|
|
||||||
`<my-app>` element in `index.html`, and call Angular's `bootstrap()` to kick
|
|
||||||
it all off like this:
|
|
||||||
|
|
||||||
+makeTabs("gettingstarted", "ts/main.ts, js/main.js", "TypeScript, JavaScript",
|
|
||||||
{ otl: [ /(AppComponent)/g, /(my-app)/g ],
|
|
||||||
pnk: / (\w*:)/g } )
|
|
||||||
|
|
||||||
.callout.is-helpful
|
|
||||||
header Annotations vs Decorators
|
|
||||||
:markdown
|
:markdown
|
||||||
If you are transpiling using a tool that translates the `@` symbols to
|
Our app loads two script files in the `<head>` element:
|
||||||
annotations (for example Traceur), you will need to import the annotation versions of
|
|
||||||
Component and View. That can be easily achieved using
|
>***angular.js***, the Angular 2 library.
|
||||||
`import {ComponentAnnotation as Component, ViewAnnotation as View}`.
|
|
||||||
|
>***app.js***, the application JavaScript which we're about to write.
|
||||||
|
|
||||||
|
In the `<body>`, there's an element called `<my-app>`. This is a placeholder for the *root* of our
|
||||||
|
application. Angular will display our application content here.
|
||||||
|
|
||||||
|
|
||||||
|
.l-main-section
|
||||||
|
:markdown
|
||||||
|
## Write the *app* component
|
||||||
|
|
||||||
|
Create an *app.js* file with the following content:
|
||||||
|
|
||||||
|
+makeExample('gettingstarted', 'js/app-class-w-annotations.js')
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
When we step back and squint, we see that
|
||||||
|
we're creating a visual component named **`appComponent`** by chaining three methods
|
||||||
|
originating in the global Angular namespace object called, **`ng`**.
|
||||||
|
|
||||||
|
```
|
||||||
|
var appComponent = ng
|
||||||
|
.Component({...})
|
||||||
|
.View({...})
|
||||||
|
.Class({...})
|
||||||
|
```
|
||||||
|
The **`Component`** method tells Angular that this is a component
|
||||||
|
controlling the element named "my-app".
|
||||||
|
|
||||||
|
+makeExample('gettingstarted', 'js/app-component.js')
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
You may remember we added such an element to our *index.html* above.
|
||||||
|
|
||||||
|
The **`View`** method identifies the HTML template
|
||||||
|
that defines the visual appearance of the component.
|
||||||
|
|
||||||
|
+makeExample('gettingstarted', 'js/app-view.js')
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
We're writing the HTML template inline
|
||||||
|
in this example. Later we'll move the HTML to a view template file and
|
||||||
|
assign the template's filename to the `templateUrl`.
|
||||||
|
We'll prefer that practice for all but the most trivial templates.
|
||||||
|
|
||||||
|
The **`Class`** method is where we implement the component itself,
|
||||||
|
giving it properties and methods that bind to the view and whatever
|
||||||
|
behavior is appropriate for this part of the UI.
|
||||||
|
|
||||||
|
+makeExample('gettingstarted', 'js/app-class.js')
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
This component has the minimum implementation:
|
||||||
|
a *no-op* constructor function that does nothing because there is nothing to do.
|
||||||
|
We'll see more interesting component classes in future examples.
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
## Run it!
|
## Run it!
|
||||||
|
|
||||||
Open `index.html` through your web server and you should see:
|
We need a file server to serve the static assets of our application (*index.html* and *app.js*).
|
||||||
|
|
||||||
|
If you have python on your machine, you're in luck: python ships with a basic static file server.
|
||||||
|
Open a terminal window and enter:
|
||||||
|
|
||||||
|
pre.prettyprint.lang-bash
|
||||||
|
code python -m SimpleHTTPServer 8000
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
then point a browser to http://localhost:8000 which should display our simple text message:
|
||||||
|
|
||||||
figure.image-display
|
figure.image-display
|
||||||
img(src='/resources/images/examples/setup-example1.png' alt="Example of Todo App")
|
img(src='/resources/images/examples/setup-example1.png' alt="Example of Todo App")
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
**If you don't have python**, you may have to install a server.
|
||||||
|
You might prefer one of the many node-based static servers such as
|
||||||
|
[http-server](https:/github.com/nodeapps/http-server "http-server"),
|
||||||
|
[superstatic](https://www.npmjs.com/package/superstatic "superstatic"), or
|
||||||
|
[live-server](https://www.npmjs.com/package/live-server "live-server").
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
For this example we'll use **live-server** because it performs a live reload by default and it's
|
||||||
|
fun to watch the browser update as we make changes.
|
||||||
|
|
||||||
|
Open a terminal (or Windows/Linux command line) and enter:
|
||||||
|
|
||||||
|
pre.prettyprint.lang-bash
|
||||||
|
code npm install -g live-server
|
||||||
|
|
||||||
|
.callout.is-helpful
|
||||||
|
:markdown
|
||||||
|
Install [**node** and **npm**](https://docs.npmjs.com/getting-started/installing-node "Installing Node.js and updating npm")
|
||||||
|
first if you haven't already. They're indispensible front-end developer tools.
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
After it finishes installing, start the server on port 8000
|
||||||
|
|
||||||
|
pre.prettyprint.lang-bash
|
||||||
|
code live-server --port=8000
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
**live-server** loads the browser for us and refreshes the page as we make
|
||||||
|
changes to the application.
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
## Explanations
|
## Add TypeScript Type Definition Files (optional)
|
||||||
|
|
||||||
This basic Angular app contains the structure for any app you'll build.
|
"*Wait*", you say, "*we're writing in JavaScript, not TypeScript!*".
|
||||||
|
Indeed we are. But code editors (such as [Visual Studio Code](https://code.visualstudio.com/) and
|
||||||
|
[Web Storm](https://www.jetbrains.com/webstorm/features/))
|
||||||
|
can improve the JavaScript development experience by providing type information and
|
||||||
|
displaying API documentation ("intellisense") based on TypeScript type definition files.
|
||||||
|
|
||||||
.l-sub-section
|
We can download type definitions files for third-party libraries such as Angular
|
||||||
:markdown
|
from the [DefinitelyTyped](http://definitelytyped.org/) repository using the
|
||||||
### It's all a tree
|
[**tsd package manager**](https://www.npmjs.com/package/tsd "TSD Package Manager").
|
||||||
|
|
||||||
You can think of Angular apps as a tree of components. This root component we've been talking about acts as the top
|
If you haven't already installed the *tsd*, do it now
|
||||||
level container for the rest of your application. You've named this one `AppComponent`, but there's
|
with an npm command entered in a terminal or command window.
|
||||||
nothing special about the name and you can use whatever makes sense to you.
|
|
||||||
|
|
||||||
The root component's job is to give a location in the `index.html` file where your application will
|
pre.prettyprint.lang-bash
|
||||||
render through its element, in this case `<my-app>`. There is also nothing special about this
|
code npm install -g tsd
|
||||||
element name; you can pick it as you like.
|
|
||||||
|
|
||||||
The root component loads the initial template for the application that will load other components to perform
|
:markdown
|
||||||
whatever functions your application needs - menu bars, views, forms, etc. We'll walk through examples of all of
|
Now let's download and install the core set of type definitions files for Angular development
|
||||||
these in the following pages.
|
in the root directory of our application.
|
||||||
|
|
||||||
.l-sub-section
|
pre.prettyprint.lang-bash
|
||||||
:markdown
|
code tsd query angular2 es6-promise rx rx-lite jasmine --action install --save
|
||||||
### @Component and @View annotations
|
|
||||||
|
|
||||||
A component annotation describes details about the component. An annotation can be identified by its at-sign (`@`).
|
:markdown
|
||||||
|
We'll find a ***typings*** folder in the root directory
|
||||||
|
with subfolders for each of the five downloaded type definition files (angular, es6-promise, rx, rx-lite, jasmine).
|
||||||
|
Type definition files have names ending in ***d.ts***.
|
||||||
|
There's also a summary ***tsd.d.ts*** file containing references to each of them.
|
||||||
|
|
||||||
The `@Component` annotation defines the HTML tag for the component by specifying the component's CSS selector.
|
Check your editor's documentation for instructions on using the *tsd.d.ts* file to
|
||||||
|
light up type checking and intellisense for these libraries.
|
||||||
|
|
||||||
The `@View` annotation defines the HTML that represents the component. The component you wrote uses an inline template, but you can also have an external template. To use an external template, specify a <code>templateUrl</code> property and give it the path to the HTML file.
|
.l-main-section
|
||||||
|
:markdown
|
||||||
|
## It's all a tree
|
||||||
|
|
||||||
.l-sub-section
|
We can think of Angular apps as a tree of components.
|
||||||
:markdown
|
|
||||||
### import vs. window.angular
|
|
||||||
|
|
||||||
The main difference between the ES5 and TypeScript versions is the loading of modules.
|
The `AppComponent` that we've been talking about acts as the top
|
||||||
|
level container - the root of the tree - for the rest of our application.
|
||||||
|
There's nothing special about the `AppComponent` name and we can use whatever makes sense to us.
|
||||||
|
|
||||||
**TypeScript**<br/>
|
We've pinned the root component to an element in the `index.html` file where our application will
|
||||||
TypeScript supports ES6 module loading syntax. ES6 modules allow for modular loading of JavaScript code. Using ES6 modules you can cherry-pick only what you need for your app.
|
render its view. The element is called `<my-app>` but there is nothing special about this
|
||||||
|
name either.
|
||||||
|
|
||||||
**Javascript**<br/>
|
The *root component* loads the initial template for the application.
|
||||||
In ES5 the script file creates an angular property on the window of the browser. This property contains every piece of Angular core, whether you need it or not.
|
That template could load other components such as menu bars, views, and forms
|
||||||
|
that display information and respond to user gestures.
|
||||||
|
|
||||||
+makeTabs('gettingstarted', 'ts/main-import.ts', 'TypeScript')
|
And these components could load yet more components until the browser page became a deep tree
|
||||||
|
of nested functionality.
|
||||||
|
|
||||||
+makeExample('gettingstarted/js', 'main-bootstrap.js', 'JavaScript')
|
We'll walk through examples of these scenarios in the following pages.
|
||||||
|
|
|
@ -10,9 +10,11 @@ include ../../../../_includes/_util-fns
|
||||||
in JavaScript and Dart by selecting either of those languages from the combo-box in the banner.
|
in JavaScript and Dart by selecting either of those languages from the combo-box in the banner.
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
We'll do it in seven short steps
|
We'll do it in short steps
|
||||||
1. Install the prerequisites for Angular TypeScript development
|
1. Install the prerequisites for Angular TypeScript development
|
||||||
1. Create a new project folder and configure TypeScript
|
1. Create an application folder
|
||||||
|
1. Install the npm packages our app needs
|
||||||
|
1. Prepare for TypeScript compilation
|
||||||
1. Create an *index.html*
|
1. Create an *index.html*
|
||||||
1. Write the root component for our application in *app.ts*
|
1. Write the root component for our application in *app.ts*
|
||||||
1. Bootstrap the app
|
1. Bootstrap the app
|
||||||
|
@ -41,18 +43,7 @@ include ../../../../_includes/_util-fns
|
||||||
code npm install -g tsd
|
code npm install -g tsd
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
Install a node **static server** to serve the static files of our application.
|
Install a node **static server** to serve our application.
|
||||||
|
|
||||||
.alert.is-helpful
|
|
||||||
|
|
||||||
:markdown
|
|
||||||
You can skip this step if you've got python on your machine because python ships with a static server.
|
|
||||||
Or you can install one of the many node-based static servers such as
|
|
||||||
[http-server](https:/github.com/nodeapps/http-server "http-server"),
|
|
||||||
[superstatic](https://www.npmjs.com/package/superstatic "superstatic"), or
|
|
||||||
[live-server](https://www.npmjs.com/package/live-server "live-server").
|
|
||||||
|
|
||||||
:markdown
|
|
||||||
We'll use **live-server** for this example because it performs a live reload by default and it's
|
We'll use **live-server** for this example because it performs a live reload by default and it's
|
||||||
fun to watch the browser update as we make changes.
|
fun to watch the browser update as we make changes.
|
||||||
|
|
||||||
|
@ -61,7 +52,7 @@ include ../../../../_includes/_util-fns
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
## Create a project folder and configure TypeScript
|
## Create the application folder
|
||||||
|
|
||||||
Create a new folder to hold our application project, perhaps like this:
|
Create a new folder to hold our application project, perhaps like this:
|
||||||
|
|
||||||
|
@ -69,60 +60,110 @@ include ../../../../_includes/_util-fns
|
||||||
code mkdir firstNgApp && cd firstNgApp
|
code mkdir firstNgApp && cd firstNgApp
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
|
We'll refer to this as our application's **root folder**.
|
||||||
|
|
||||||
|
.l-main-section
|
||||||
|
:markdown
|
||||||
|
## Install npm packages
|
||||||
|
|
||||||
|
Our application will need some 3rd party JavaScript files:
|
||||||
|
|
||||||
|
>***angular.js***, the Angular 2 library.
|
||||||
|
|
||||||
|
>***es6-module-loader***, a "shim" that enables today's browsers load files
|
||||||
|
using the latest "ES6" JavaScript syntax.
|
||||||
|
|
||||||
|
>***system.js***, a third-party open-source library that adds module loading functionality to our browser.
|
||||||
|
|
||||||
|
>***traceur-runtime.js*** to transpile the TypeScript-generated JavaScript into the version of Javascript
|
||||||
|
our browser understands (the version known as "ES5").
|
||||||
|
|
||||||
|
For our little "GettingStarted" app, we could just install these packages
|
||||||
|
with four npm commands.
|
||||||
|
|
||||||
|
In our real apps, we'd take an extra minute to create a *package.json* configuration file.
|
||||||
|
This is a more robust, less error-prone approach, that we can maintain as our application evolves.
|
||||||
|
|
||||||
|
Create this **package.json** file in the root folder:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"name": "getting-started",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"dependencies": {
|
||||||
|
"angular2": "2.0.0-alpha.35",
|
||||||
|
"es6-module-loader": "^0.16",
|
||||||
|
"systemjs": "^0.16",
|
||||||
|
"traceur": "0.0.91"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Now we install our script packages with one command
|
||||||
|
|
||||||
|
pre.prettyprint.lang-bash
|
||||||
|
code npm install
|
||||||
|
|
||||||
|
.l-main-section
|
||||||
|
:markdown
|
||||||
|
## Prepare for TypeScript Compilation
|
||||||
|
|
||||||
|
We're done at the root level of our application.
|
||||||
|
We'll build the rest of the application in a subfolder called *src*.
|
||||||
|
Let's make that folder and go there.
|
||||||
|
|
||||||
|
pre.prettyprint.lang-bash
|
||||||
|
code mkdir src && cd src
|
||||||
|
|
||||||
|
:markdown
|
||||||
|
We have one last preparation step before we start coding.
|
||||||
|
|
||||||
We prefer writing TypeScript apps in an editor that understands TypeScript,
|
We prefer writing TypeScript apps in an editor that understands TypeScript,
|
||||||
an editor such as [Visual Studio Code](https://code.visualstudio.com/) or
|
an editor such as [Visual Studio Code](https://code.visualstudio.com/) or
|
||||||
[Web Storm](https://www.jetbrains.com/webstorm/features/).
|
[Web Storm](https://www.jetbrains.com/webstorm/features/).
|
||||||
|
|
||||||
We should tell that editor how to compile TypeScript to JavaScript
|
We need to tell that editor how to interpret our TypeScript
|
||||||
with a configuration file named **tsconfig.json**.
|
which we do with a configuration file named **tsconfig.json**.
|
||||||
This configuration file also simplifies the TypeScript compilation command we'll run later in this story.
|
This configuration file also simplifies the TypeScript compilation command we'll run later in this story.
|
||||||
|
|
||||||
Create *tsconfig.json* now with the following JSON content:
|
Create *tsconfig.json* now with the following JSON content:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES5",
|
"target": "ES5",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"emitDecoratorMetadata": true,
|
"emitDecoratorMetadata": true,
|
||||||
"experimentalDecorators": true
|
"experimentalDecorators": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
## Create an *index.html*
|
## Create an *index.html*
|
||||||
|
|
||||||
Add a new `index.html` file to the project folder and enter the following HTML
|
Add a new `index.html` file to the project folder and enter the following HTML
|
||||||
|
|
||||||
+makeExample('gettingstarted', 'ts/index.html', 'index.html')
|
+makeExample('gettingstarted', 'ts/src/index.html', 'index.html')
|
||||||
|
|
||||||
.l-sub-section
|
.l-sub-section
|
||||||
:markdown
|
:markdown
|
||||||
Our app loads three script files in the `<head>` element:
|
Notice in the `<head>` element that we're loading the scripts we installed earlier with npm.
|
||||||
|
|
||||||
>***traceur-runtime.js*** to transpile the TypeScript-generated JavaScript into the version of Javascript
|
There's an element called `<app>` in the `<body>`. This is a placeholder for the *root* of our
|
||||||
our browser understands (the version known as "ES5").
|
|
||||||
|
|
||||||
>***system.js***, a third-party open-source library that adds module loading functionality to our browser.
|
|
||||||
|
|
||||||
>***angular.js***, the Angular 2 library.
|
|
||||||
|
|
||||||
In the `<body>`, there's an element called `<my-app>`. This is a placeholder for the *root* of our
|
|
||||||
application. Angular will display our application content here.
|
application. Angular will display our application content here.
|
||||||
|
|
||||||
The final inline script tells *system.js* to load another JavaScript file named "app".
|
The final inline script tells *system.js* to load another JavaScript file named "app".
|
||||||
We haven't written that file yet; let's do so now.
|
We haven't written that file yet; let's do so now.
|
||||||
|
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
## Write the *app* component
|
## Write the *app* component
|
||||||
|
|
||||||
Create an *app.ts* file and add an empty class called `AppComponent` as follows:
|
Create an *app.ts* file and add an empty class called `AppComponent` as follows:
|
||||||
|
|
||||||
+makeExample('gettingstarted', 'ts/app-class.ts')
|
+makeExample('gettingstarted', 'ts/src/app-class.ts')
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
We won't ask this class to do anything. It's just an empty, meaningless class until we tell
|
We won't ask this class to do anything. It's just an empty, meaningless class until we tell
|
||||||
|
@ -130,13 +171,13 @@ include ../../../../_includes/_util-fns
|
||||||
|
|
||||||
We import the `component` and `view` *annotations* that we need from the Angular library at the top of the file:
|
We import the `component` and `view` *annotations* that we need from the Angular library at the top of the file:
|
||||||
|
|
||||||
+makeExample('gettingstarted', 'ts/app-import.ts')
|
+makeExample('gettingstarted', 'ts/src/app-import.ts')
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
Then we apply those annotations to the `AppComponent` class by writing the following lines
|
Then we apply those annotations to the `AppComponent` class by writing the following lines
|
||||||
just above the class definition:
|
just above the class definition:
|
||||||
|
|
||||||
+makeExample('gettingstarted', 'ts/app-class-w-annotations.ts')
|
+makeExample('gettingstarted', 'ts/src/app-class-w-annotations.ts')
|
||||||
|
|
||||||
.l-sub-section
|
.l-sub-section
|
||||||
:markdown
|
:markdown
|
||||||
|
@ -160,12 +201,12 @@ include ../../../../_includes/_util-fns
|
||||||
with an instance of the `AppComponent` class as the root component.
|
with an instance of the `AppComponent` class as the root component.
|
||||||
We call this "bootstrapping the app".
|
We call this "bootstrapping the app".
|
||||||
|
|
||||||
+makeExample('gettingstarted', 'ts/app-bootstrap.ts')
|
+makeExample('gettingstarted', 'ts/src/app-bootstrap.ts')
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
Here is the complete *app.ts*
|
Here is the complete *app.ts*
|
||||||
|
|
||||||
+makeExample('gettingstarted', 'ts/app.ts', 'app.ts')
|
+makeExample('gettingstarted', 'ts/src/app.ts', 'app.ts')
|
||||||
|
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
|
@ -175,43 +216,47 @@ include ../../../../_includes/_util-fns
|
||||||
We've written our app in TypeScript but the browser only understands JavaScript.
|
We've written our app in TypeScript but the browser only understands JavaScript.
|
||||||
We must run the TypeScript compiler to produce JavaScript for the browser.
|
We must run the TypeScript compiler to produce JavaScript for the browser.
|
||||||
|
|
||||||
Open a terminal window in the root of the code director and enter:
|
Open a terminal window in the **root of the application folder** (not *src*) and enter:
|
||||||
|
|
||||||
pre.prettyprint.lang-bash
|
pre.prettyprint.lang-bash
|
||||||
code tsc
|
code tsc -p src -w
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
After it runs we should find the generated *app.js* file in the project folder and also an *app.map.js* file that
|
After it runs we should find the generated *app.js* file in the *src* folder and also an *app.map.js* file that
|
||||||
helps debuggers navigate between the JavaScript and the TypeScript source.
|
helps debuggers navigate between the JavaScript and the TypeScript source.
|
||||||
|
|
||||||
|
We gave *tsc* the watch option (`-w`). It will watch for changes to our *.ts* files and
|
||||||
|
recompile them automatically. Leave it running in this terminal window.
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
## Run it!
|
## Run it!
|
||||||
|
|
||||||
Now we can see this app in action by serving the files we created with a local web server.
|
Now we are ready to see this app in action.
|
||||||
|
|
||||||
Open a another terminal window in the root of the code directory and launch the server.
|
Open a another terminal window in the **root of the application folder** (not *src*) and
|
||||||
|
launch a node static server such as the *live-server* we recommended earlier:
|
||||||
If we have python installed on our machine, we can run a basic HTTP server:
|
|
||||||
|
|
||||||
pre.prettyprint.lang-bash
|
pre.prettyprint.lang-bash
|
||||||
code python -m SimpleHTTPServer 8000
|
code live-server --open src
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
then point a browser to http://localhost:8000 which should display our simple text message:
|
**live-server** loads the browser for us, serves the HTML and JavaScript files, and we should see it display our
|
||||||
|
application message:
|
||||||
|
|
||||||
figure.image-display
|
figure.image-display
|
||||||
img(src='/resources/images/examples/setup-example1.png' alt="Example of Todo App")
|
img(src='/resources/images/examples/setup-example1.png' alt="Example of Todo App")
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
Alternatively, we might run with a node server such as the *live-server* we recommended earlier:
|
### Make some changes
|
||||||
|
**live-server** detects changes to our files and refreshes the browser page for us automatically.
|
||||||
|
|
||||||
pre.prettyprint.lang-bash
|
Try changing the message to "My SECOND Angular 2 app".
|
||||||
code live-server --port=8000
|
|
||||||
|
|
||||||
:markdown
|
The TypeScript compiler running in the first terminal window is watching our source code. It recompiles and produces
|
||||||
**live-server** loads the browser for us and refreshes the page as we make
|
the revised *app.js*. The *live-server* sees that change and reloads the browser.
|
||||||
changes to the application. *Check it out!*
|
|
||||||
|
Pretty nice!
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:markdown
|
:markdown
|
||||||
|
@ -228,14 +273,14 @@ include ../../../../_includes/_util-fns
|
||||||
that we installed earlier.
|
that we installed earlier.
|
||||||
|
|
||||||
Let's download and install the core set of type definitions files for Angular development
|
Let's download and install the core set of type definitions files for Angular development
|
||||||
in the root directory of our application.
|
in the ***src* folder** of our application.
|
||||||
|
|
||||||
pre.prettyprint.lang-bash
|
pre.prettyprint.lang-bash
|
||||||
code tsd query angular2 es6-promise rx rx-lite jasmine --action install --save
|
code tsd install angular2 es6-promise rx rx-lite --save
|
||||||
|
|
||||||
:markdown
|
:markdown
|
||||||
We'll find a ***typings*** folder in the root directory
|
We'll find a new ***typings*** folder
|
||||||
with subfolders for each of the five downloaded type definition files (angular, es6-promise, rx, rx-lite, jasmine).
|
with subfolders for each of the downloaded type definition files (angular, es6-promise, rx, and rx-lite).
|
||||||
Type definition files have names ending in ***d.ts***.
|
Type definition files have names ending in ***d.ts***.
|
||||||
There's also a summary ***tsd.d.ts*** file containing references to each of them.
|
There's also a summary ***tsd.d.ts*** file containing references to each of them.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue