组件类

组件类控制模板的渲染,换句话说Angular的渲染是靠数据,理解这一点非常重要。

一、长什么样?

通过 @Component 装饰器,可以快速告诉Angular这个组件是什么样的。

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent { }

这里传递了三个信息:

  • selector 给组件设个门牌号,当这个组件被使用时,用它来告诉组件所处的位置。
  • templateUrl 告诉组件布局是什么样子的。
  • styleUrls 告诉组件应该粉刷成什么样子的。

selector

一个带有语义的名称对于定位非常重要,因为组件最终在DOM树中会以 <app-root></app-root> 这样的标签存在。

有很多文章或人会告诉你这个名词就像 CSS Selector(CSS选择器)一样,所以也可以设置为 [app-root] 而调用是 <div app-root></div>,二者虽说都没问题,但我不建议这么理解,因为组件就是组件,它是有意义的一个完整性功能完整的DOM

templateUrl

指定组件模板,同她后缀意思一样传递的是一个 URL 地址 ./app.component.html。当 Webpack 打包以后,会将上面的内容打包进js文件中。

./ 表示当前所在目录。

当然她也提供另一种写法,可以直接将模板内容写在装饰器里面。

template: `<h1></h1>`

styleUrls

同组件模板类似,只不过她是以数组形式出现。(别问我为什么是数组)

这里的URL接收不光可以是一个 css 文件,她允许接收时下所有浏览CSS预处理(例:scss、less等),当然这并不是Angular的功能,而是Webpack的特性。

更多细节见样式章节。

二、类

组件类作用是控制模板渲染,而控制的手段就是数据。这一点非常重要,假设想要模板输出 “Hi,cipchk,约吗?”。

@Component({
  selector: 'app-root',
  template: `<p>{{ hi }}</p>`
})
export class AppComponent {
    hi: string = `Hi,cipchk,约吗?`;

    constructor() {
        setTimeout(() => {
            this.hi = `^_^`;
        }, 1e3)
    }
}

模板里用一对双大括号包裹着组件类 hi 属性,你可以随时改变 hi 属性的值(这里设置了一个定时器3秒后改变值),Angular会实时同步更新模板的渲染。

constructor 组件类构造函数,且由DI来完成实例。

组件模板与组件类的交互是通过DOM事件来完成的,增加一组按钮,来告诉组件类到底约不约。

@Component({
  selector: 'app-root',
  template: `
  <p>{{ hi }}</p>
  <button (click)="telAs(true)">约</button>
  <button (click)="telAs(false)">不约</button>
  `
})
export class AppComponent {
    hi: string = `Hi,cipchk,约吗?`;

    telAs(result: boolean) {
      this.hi = result ? '你家、我家,还是如家?' : '88';
    }
}

模板使用 (click)="telAs(true)" 来访问组件类的方法,左边为DOM标准事件名 click,右边对应的是组件类 telAs 方法名及所须参数。

三、小结

除了ts 语法外,你是否发现上面的代码中并没有出现任何陌生的名词,模板中 (click) 点击事件名再熟悉不过了,而组件类也只是一个再简单不过的 ts 类而已。

这就是新的Angular模板引擎带来的变化,尽可能的依赖标准、减少学习成本。

如果你很细心不知是否发现,模板中会用 两对大括号() 来表示一些特定的行为能力,这其实是Angular的一种数据流向的约定,这一点在模板语法-绑定语法会详细介绍。

results matching ""

    No results matching ""