黑马程序员技术交流社区

标题: 【广州前端首发】Angular5语法核心课程(二) [打印本页]

作者: AreYouGlad    时间: 2018-1-8 19:59
标题: 【广州前端首发】Angular5语法核心课程(二)
本帖最后由 AreYouGlad 于 2018-1-8 19:59 编辑

查看更多精彩前端资源


模版引擎
插值表达式
使用尝试
[JavaScript] 纯文本查看 复制代码
export class AppComponent {
  title = 'app';
  site = '深圳';     // 自己添加的属性
  constructor() {}
}

[JavaScript] 纯文本查看 复制代码
<h1>
    Welcome to {{ site }}!
</h1>

基本运算
[JavaScript] 纯文本查看 复制代码
  <h1>
    Welcome to {{ site }}!
  </h1>
  <p>{{ site == '深圳'? '房子太贵我要离开': '哥甚是怀念深圳蜗居的日子' }}</p>

事件绑定
尝试点击事件
[JavaScript] 纯文本查看 复制代码
<!-- 事件绑定语法: (事件名)=函数() -->
<button (click)='clickHandler()'>点我</button>

[JavaScript] 纯文本查看 复制代码
export class AppComponent {
  title = 'app';
  site = '深圳';

  // 点击事件处理函数
  clickHandler(): void {
    console.log('按钮被点击');
  }
}

尝试表单事件
[JavaScript] 纯文本查看 复制代码
<!-- 如果需要事件对象, 那么传入$event即可 -->
<input type="text" (input)='inputHandler($event)'>
// 表单事件处理函数
inputHandler(e): void {
  console.log(`表单最新值为: ${e.target.value}`);
}

数据绑定特性
[JavaScript] 纯文本查看 复制代码
// 表单事件处理函数
inputHandler(e): void {
  this.site = e.target.value;  // 修改site属性的值
}

指令
*ngIf
[JavaScript] 纯文本查看 复制代码
<!-- isTure的值控制元素的添加移除 -->
<p *ngIf="isTure">控制我的添加与移除</p>

export class AppComponent {
  title = 'app';
  site = '深圳';
  isTure = false;    // 使用这个值控制元素
}

数据驱动开发思想
[JavaScript] 纯文本查看 复制代码
<!-- *ngIf, isTure的值控制元素的添加移除 -->
<div>
  <p *ngIf="isTure">控制我的添加与移除</p>
  <button (click)='clickAddOrRemove()'>{{ isTure? '移除': '添加' }}</button>
</div>

export class AppComponent {
  title = 'app';
  site = '深圳';
  isTure = false;    // 使用这个值控制元素

  // 点击事件, 只要修改isTure属性, 就可以控制元素的添加移除
  clickAddOrRemove(): void {
    this.isTure = !this.isTure;
  }
}

*ngFor基本使用
[JavaScript] 纯文本查看 复制代码
<!-- *ngFor, 里面采用的语法是固定格式 -->
<ul>
  <li *ngFor="let city of cityList">{{ city }}</li>
</ul>

export class AppComponent {
  title = 'app';
  site = '深圳';
  isTure = false;    // 使用这个值控制元素
  cityList = [
    '北京',
    '上海',
    '广州',
    '深圳'
  ];
}
拿到数组下标
[JavaScript] 纯文本查看 复制代码
<!-- *ngFor, 下面是获取下标并使用的语法 -->
<ul>
  <li *ngFor="let city of cityList; let i = index">{{ i }} : {{ city }}</li>
</ul>
性能优化
[JavaScript] 纯文本查看 复制代码
<ul>
  <!-- *ngFor, 下面是添加trackBy的语法, trackBy要求赋值一个函数, 这里把trackByCity赋了过去 -->
  <li *ngFor="let city of cityList; let i = index; trackBy: trackByCity">{{ i }} : {{ city }}</li>
</ul>

export class AppComponent {
  cityList = [
    '北京',
    '上海',
    '广州',
    '深圳'
  ];
  // trackBy函数会自动接收到ngFor遍历到的下标与item
  // 这里因为数据结构比较简单, 把下标与值拼在一起作为元素ID返回
  trackByCity(index: number, item: any) {
          return index + '_' + item;
  }
}
trackBy简写
[JavaScript] 纯文本查看 复制代码
<ul>
  <!-- 这里需要注意的是里面赋值时使用的?号, 没有它将报错 -->
  <li *ngFor="let user of userList; trackBy: user?.id">{{ user.name }}</li>
</ul>

export class AppComponent {
  userList = [
    {name: '花花', age: 16, id: 10001},
    {name: '草草', age: 18, id: 10002}
    {name: '云云', age: 20, id: 10003},
    {name: '朵朵', age: 15, id: 10004}
  ];
}
ngSwitch指令组
[HTML] 纯文本查看 复制代码
<!-- ngSwitch指令组,这里使用以前的site数据进行控制 -->
<!-- 其中的*ngSwitchCase因为不使用数据绑定,而是写死的字符串,所以里面的值添加单引号包裹 -->
<div [ngSwitch]='site'>
  <p *ngSwitchCase="'北京'">北京冬天有暖气</p>
  <p *ngSwitchCase="'上海'">上海冬天有空调</p>
  <p *ngSwitchCase="'深圳'">深圳冬天要裹被</p>
  <p *ngSwitchDefault>不管在哪, 只要不过冬天就好</p>
</div>
属性指令 - 原生的DOM属性修改innerHTML属性
[JavaScript] 纯文本查看 复制代码
<!-- 使用[]属性指令语法动态修改元素的innerHTML -->
<div [innerHTML]="tpl"></div>

export class AppComponent {
        title = 'app';
        tpl = `<div>
            <h4>我是数据里的字符串模版</h4>
            <h4>我是数据里的字符串模版</h4>
    </div>`;
}
其他属性范例
[JavaScript] 纯文本查看 复制代码
<div>
  <a [href]="aHref">点击跳转</a>
  <img [src]="imgSrc"/>
</div>

export class AppComponent {
  aHref = 'http://www.baidu.com';
  imgSrc = 'http://www.baidu.com/img/bd_logo1.png';
}
container容器错误范例
[HTML] 纯文本查看 复制代码
<ul>
  <li *ngFor="let city of cityList; let i = index" *ngIf="i % 2 == 0">{{ i }} : {{ city }}</li>
</ul>
解决方案
[HTML] 纯文本查看 复制代码
<!-- 不能在一个元素上使用多个结构性指令,那么可以嵌套ng-container标签解决 -->
<ul>
  <ng-container *ngFor="let city of cityList; let i = index">
    <li *ngIf="i % 2 == 0">{{ i }} : {{ city }}</li>
  </ng-container>
</ul>
[(ngModel)] - 双向数据绑定准备工作
[JavaScript] 纯文本查看 复制代码
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

// 导入表单模块
import { FormsModule } from '@angular/forms';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule     // 把表单模块配置进来
  ],
  providers: [
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }
使用
[JavaScript] 纯文本查看 复制代码
<div>
  <h2>请输入新密码</h2>
  <!-- 使用了双向数据绑定后, password的值会自动显示到表单, 表单改变时password也自动改变 -->
  <input type="text" [(ngModel)]="password">
  <span>{{ password }}</span>
</div>

export class AppComponent {
        password = '默认密码';
}


作者: AreYouGlad    时间: 2018-1-8 20:00





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2