ng2学习初体验

本文介绍如何使用Angular 2-webpack-starter模板搭建项目,并解决常见问题。文章详细记录了从安装依赖到配置路由的过程,同时分享了创建测试模块的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天试着跑了一下项目 https://github.com/AngularClass/angular2-webpack-starter
不出意外地踩了几个坑
将项目代码下载到本地后
按照项目提示,事先安装好以下几个依赖包(当然首先要有个node)

* webpack (npm install --global webpack)
* webpack-dev-server (npm install --global webpack-dev-server)
* karma (npm install --global karma-cli)
* protractor (npm install --global protractor)
* typescript (npm install --global typescript)

然后cd进入项目
执行命令行cnpm install,安装完毕后,再执行
npm run server

最后打开浏览器,输入locahost:3000
如果没有意外,就可以看到下面这个华丽丽的界面了。。。
界面

然后模仿demo写一个test模块
设置新模块的路由时,需要修改的文件有三个:app.module.ts,app.routes.ts,app.component.ts

(1) 创建一个新的模块test文件结构
(2) index.ts

export * from './test.component';

(3) test.component.ts

import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
/*
* We're loading this component asynchronously
* We are using some magic with es6-promise-loader that will wrap the module with a Promise
* see https://github.com/gdi2290/es6-promise-loader for more info
*/

console.log('`Test` component loaded asynchronously');

@Component({
  selector: 'test',
  styles: [`
  `],
  template: `
    <h1>Test</h1>
    <div>
      For hot module reloading run
      <pre>npm run start:hmr</pre>
    </div>
    <div>
      <h3>
        patrick@AngularClass.com
      </h3>
    </div>
    <pre>this.localState = {{ localState | json }}</pre>
  `
})
export class Test {
  localState: any;
  constructor(public route: ActivatedRoute) {

  }

  ngOnInit() {
    this.route
      .data
      .subscribe((data: any) => {
        // your resolved data from route
        this.localState = data.yourData;
      });

    console.log('hello `Test` component');
    // static data that is bundled
    // var mockData = require('assets/mock-data/mock-data.json');
    // console.log('mockData', mockData);
    // if you're working with mock data you can also use http.get('assets/mock-data/mock-data.json')
    this.asyncDataWithWebpack();
  }
  asyncDataWithWebpack() {
    // you can also async load mock data with 'es6-promise-loader'
    // you would do this if you don't want the mock-data bundled
    // remember that 'es6-promise-loader' is a promise
    setTimeout(() => {

      System.import('../../assets/mock-data/mock-data.json')
        .then(json => {
          console.log('async mockData', json);
          this.localState = json;
        });

    });
  }

}

(4) test.spec.ts

import { ActivatedRoute, Data } from '@angular/router';
import { Component } from '@angular/core';
import { inject, TestBed } from '@angular/core/testing';

// Load the implementations that should be tested
import { Test } from './test.component';

describe('Test', () => {
  // provide our implementations or mocks to the dependency injector
  beforeEach(() => TestBed.configureTestingModule({
    providers: [
      // provide a better mock
      {
        provide: ActivatedRoute,
        useValue: {
          data: {
            subscribe: (fn: (value: Data) => void) => fn({
              yourData: 'yolo'
            })
          }
        }
      },
      Test
    ]
  }));

  it('should log ngOnInit', inject([Test], (test: Test) => {
    spyOn(console, 'log');
    expect(console.log).not.toHaveBeenCalled();

    test.ngOnInit();
    expect(console.log).toHaveBeenCalled();
  }));

});

(5) 修改app.module.ts

import { Home } from './home';
import { About } from './about';
import { Test } from './test';//新增
import { NoContent } from './no-content';
import { XLarge } from './home/x-large';

(6) 修改app.routes.ts

import { Routes, RouterModule } from '@angular/router';
import { Home } from './home';
import { About } from './about';
import { Test } from './test';//新增
import { NoContent } from './no-content';

import { DataResolver } from './app.resolver';

export const ROUTES: Routes = [
  { path: '',      component: Home },
  { path: 'home',  component: Home },
  { path: 'about', component: About },
  { path: 'test', component: Test },//新增
  {
    path: 'detail', loadChildren: () => System.import('./+detail')
  },
  { path: '**',    component: NoContent },
];

(7) 修改app.component.ts

template: `
    <nav>
      <span>
        <a [routerLink]=" ['./'] ">
          Index
        </a>
      </span>
      |
      <span>
        <a [routerLink]=" ['./home'] ">
          Home
        </a>
      </span>
      |
      <span>
        <a [routerLink]=" ['./detail'] ">
          Detail
        </a>
      </span>
      |
      <span>
        <a [routerLink]=" ['./about'] ">
          About
        </a>
      </span>
      |
      <span>
        <a [routerLink]=" ['./test'] ">
          Test
        </a>
      </span>

    </nav>

    <main>
      <router-outlet></router-outlet>
    </main>

    <pre class="app-state">this.appState.state = {{ appState.state | json }}</pre>

    <footer>
      <span>WebPack Angular 2 Starter by <a [href]="url">@AngularClass</a></span>
      <div>
        <a [href]="url">
          <img [src]="angularclassLogo" width="25%">
        </a>
      </div>
    </footer>
  `

下面是遇到的几个问题:

1. 在ts的constructor构造函数中使用this.xxx,webstorm文件提示undefined错误(未知)
2. npm buidl:prod报错——已解决:https://github.com/AngularClass/angular2-webpack-starter/issues/1048

github截图

3. ngFor

之前看的教程http://www.hubwiz.com/class/5599d367a164dd0d75929c76上是这样用的

<ul>
   <li *ng-for="#film of films">{{film}}</li>
</ul>

但是看到最新的官网https://angular.io/docs/ts/latest/api/common/index/NgFor-directive.html上,是这样的:

 <li *ngFor="let item of items; let i = index; trackBy: trackByFn">...</li>

这个教程应该是去年的= =。。。所以还是要多看看官网啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值