尝试进行 Angular 2 的“英雄之旅”教程

首先

上回进行了快速入门,对Angular有了一定的了解。

所以,我想要开始做教程,但是…

「英雄之旅?(Tour of Heroes)」

Angular的教程相当有趣。
因此,我将继续进行教程。

更改目录名称

首先根据angular2-tour-of-heroes中的指示,将目录名称进行更改。

$ cd ../
$ mv angular2-quickstart/ angular2-tour-of-heroes/
$ cd angular2-tour-of-heroes

嗯,另外,关于上次的谜题,是说要始终运行npm run tsc来启动TypeScript的感知功能。

顺便说一下,在这附近使用grant之类的东西是否必要呢?因为我觉得只用tsc就足够了,这样就可以了吧?

更改标题

请提前在两个终端中执行以下命令。

$ npm run tsc
$ npm start

因为教程上说要添加以下内容,所以尝试将其添加到 app.ts 文件中。

class AppComponent {
  public title = 'Tour of Heroes';
  public hero = 'Windstorm';
}

因为还写着要添加以下内容,所以需要追加。

template: '<h1>{{title}}</h1><h2>{{hero}} details!</h2>'

结果如下。

import {bootstrap, Component} from 'angular2/angular2';
@Component({
    selector: 'my-app',
    template: '<h1>{{title}}</h1><h2>{{hero}} details!</h2>'
})
class AppComponent {
  public title = 'Tour of Heroes';
  public hero = 'Windstorm';
}

bootstrap(AppComponent);

浏览器已经变成了以下的样子。

Tour of Heroes

Windstorm details!

自動地进行变化真的很令人惊讶!但是,机制(因果关系)仍然不明。

展示英雄

由于要添加一个专门用于英雄的类,所以请将以下内容添加到app.ts的顶部。

import {bootstrap, Component} from 'angular2/angular2';
class Hero {
  id: number;
  name: string;
}
@Component({
    selector: 'my-app',
    template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2>'
})
class AppComponent {
  public title = 'Tour of Heroes';
  public hero: Hero = {
    id: 1,
    name: 'Windstorm'
  };
}

bootstrap(AppComponent);

最终会创造出上述的状态。

因此,有一个主题是在实施后提供更详细信息,进一步进行以下更改。

import {bootstrap, Component} from 'angular2/angular2';
class Hero {
  id: number;
  name: string;
}
@Component({
    selector: 'my-app',
    template: '<h1>{{title}}</h1><h2>{{hero.name}} details!</h2><div><label>id: </label>{{hero.id}}</div><div><label>name: </label>{{hero.name}}</div>'
})
class AppComponent {
  public title = 'Tour of Heroes';
  public hero: Hero = {
    id: 1,
    name: 'Windstorm'
  };
}

bootstrap(AppComponent);

如果继续这样下去,模板会变得难以阅读,所以使用Here Document可以变成以下的样子。

import {bootstrap, Component} from 'angular2/angular2';
class Hero {
  id: number;
  name: string;
}
@Component({
    selector: 'my-app',
    template: `
<h1>{{title}}</h1>
<h2>{{hero.name}} details!</h2>
<div><label>id: </label>{{hero.id}}</div>
<div><label>name: </label>{{hero.name}}</div>`
})
class AppComponent {
  public title = 'Tour of Heroes';
  public hero: Hero = {
    id: 1,
    name: 'Windstorm'
  };
}

bootstrap(AppComponent);

注意:请使用反引号(`),而不是单引号(‘)。这对于写Qiita的人来说很熟悉。

编辑英雄名称

接下来,我们要编写接收数据的处理程序。

import {bootstrap, Component} from 'angular2/angular2';
class Hero {
  id: number;
  name: string;
}
@Component({
    selector: 'my-app',
    template: `
  <h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div>
    <label>name: </label>
    <div><input value="{{hero.name}}" placeholder="name"></div>
  </div>
`
})
class AppComponent {
  public title = 'Tour of Heroes';
  public hero: Hero = {
    id: 1,
    name: 'Windstorm'
  };
}

bootstrap(AppComponent);

使用输入框进行输入。
然而,由于这样无法反映输入数据,所以将input部分更改如下。

<input [(ng-model)]="hero.name" placeholder="name">

我被告知要添加NgModel…

EXCEPTION: No value accessor for ' ' in [null]

最後他們告訴你要用FORM_DIRECTIVES,最終結果如下:

import {bootstrap, Component, FORM_DIRECTIVES} from 'angular2/angular2';
class Hero {
  id: number;
  name: string;
}
@Component({
  selector: 'my-app',
  template:`
    <h1>{{title}}</h1>
    <h2>{{hero.name}} details!</h2>
    <div><label>id: </label>{{hero.id}}</div>
    <div>
      <label>name: </label>
      <div><input [(ng-model)]="hero.name" placeholder="name"></div>
    </div>
    `,
  directives: [FORM_DIRECTIVES]
})
class AppComponent {
  public title = 'Tour of Heroes';
  public hero: Hero = {
    id: 1,
    name: 'Windstorm'
  };
}
bootstrap(AppComponent);

当你在浏览器上看到这个时,更改英雄名字将立即反映出来。

最后

只要把代码放在程序的哪个部分就能解决问题,可能是因为英语的影响,我很难理解。就连把@Component的”directives”放在”selector”之上也不能正常运行……。

尽管如此, Angular 的特色即数据绑定仍然令人印象深刻,输入的文字能够立即反映出来真是太棒了。相比 Angular 1,对 HTML 的负担减少了,因此感觉更加易于处理。

而且,我认为@ Component的范围已经限制在内部,所以对数据的修改只影响其中一部分,这也是一个很好的变化。
另一方面,我不知道该如何编写才能在整个应用中应用想要的变量(例如在index.html中写上{{hero.name}}但没有转换)。

另外,無法將模板部分以HTML文件的形式導出非常不方便。我期待在接下來的教程中找到解決這個問題的方法。

广告
将在 10 秒后关闭
bannerAds