zoukankan      html  css  js  c++  java
  • 【Angular 5】数据绑定、事件绑定和双向绑定

    本文为Angular5的学习笔记,IDE使用Visual Studio Code,内容是关于数据绑定,包括Property Binding、Class Binding、Style Binding。 

    在Angular里,有两种绑定,一种是数据绑定(Data Binding),另一种是事件绑定(Event Binding)。

    数据流从类到视图则是数据绑定,即在类中改变变量的值,UI视图会跟着改变;反之,事件绑定是随着触发UI视图,类中也会产生相应的变化,比如鼠标点击、键盘点击触发事件。双向绑定则是数据绑定+事件绑定的结合。下面讲一一介绍数据绑定、事件绑定和双向绑定。

    一、数据绑定 Data Binding

    打开使用Angular CLI命令创建一个组件,命名为test

    ng g c test

    文件根目录如下:

    app.component.x 系列为页面的根模块,可由多个components组成,上述的test就是其中之一,每一个component中包括属于自己.html, .css,.ts文件,在根结构中可以引用各个component。

    app.component.ts 里可以定义元数据,比如@Component,其里面的templateUrl、styleUrls会告诉 Angular 从哪里获取你为组件指定html和css文件。

    方法一:

    app.component.ts

    import { Component } from '@angular/core';
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent {
      title = 'app';
    }

    方法二:可以使用在元数据里的template和styles直接定义html和css,如下方式

    app.component.ts

    import { Component } from '@angular/core';

    @Component({
      selector: 'app-root',
      template: `
        <h2>
          Welcome {{name}}
        </h2>
      `
     ,
      styles: [`
        .text-success {
          color : green;
        }
        .text-danger {
          color : red;
        }
        .text-special {
          font-style : italic;
        }
      `]
    })
    export class AppComponent {
      title = 'app';
    }

    若使用方法一,则可以在其对应的html中,引用其他模块,比如test模块,以标签<app-test></app-test> 的方式嵌入。

    app.component.html

    <!--The content below is only a placeholder and can be replaced.-->
    <div style="text-align:center">
      <h1>
        From AppComponent!
      </h1>
      <app-test></app-test>
    </div>

    1. Property Binding

        Property Binding是对html中标签属性进行绑定,下面在test模块下进行一系列绑定操作,在此模块使用上述方法二对进行模块开发,代码皆在test.component.ts下编写。

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'app-test',
      template: `
        <h2>
          Welcome {{name}}
        </h2>
        <input id = {{myId}} type = "text" value = "Vishwas">
        <input [id] = "myId" type = "text" value = "Wish">
      `
     ,
      styles: [`
        .text-success {
          color : green;
        }
        .text-danger {
          color : red;
        }
        .text-special {
          font-style : italic;
        }
      `]
    })
    export class TestComponent implements OnInit {
     public name = "Dan"
     
      public myId = "testId"
    
      constructor() { }
    
      ngOnInit() {
      }
    
    } 
    [id] = "myId" 是把在TestComponent里声明的myId的值赋给html的相应标签中id属性,即id = "testId",并绑定该属性。
    在命令行内CLI输入 ng serve,开启http://localhost:4200/服务,在浏览器下访问http://localhost:4200/,并对控件进行监测(inspect),效果如下,显示为 id = "testId",说明绑定成功!

    2.  Class Binding

         Class Binding是对 css 中的class类进行绑定,方法和Property Binding相似。

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'app-test',
      template: `
        <h2>
          Welcome {{name}}
        </h2>
        
        <input id = {{myId}} type = "text" value = "Vishwas">
        <input [id] = "myId" type = "text" value = "Wish">
    
        <h2 class="text-success">
          Convolution
        </h2>
        <h2 [class]="successClass">
          Convolution
        </h2>
        <h2 [class.text-danger] = "hasError">
          Convolution
        </h2>
    
        <h2 [ngClass]="messageClasses">
          Convolution
        </h2>
        `
     ,
      styles: [`
        .text-success {
          color : green;
        }
        .text-danger {
          color : red;
        }
        .text-special {
          font-style : italic;
        }
      `]
    })
    export class TestComponent implements OnInit {
    
      public name = "Dan";
      public myId = "testId"
    
      public isDisabled = false;
      public successClass = "text-success"
      public hasError = true;
      public isSpecial = true;
      public messageClasses = {
        "text-success": !this.hasError, //false
        "text-danger": this.hasError,  //true
        "text-special": this.isSpecial //true
      }
      constructor() { }
    
      ngOnInit() {
      }
    
    }
    [class.text-danger] = "hasError" 若hasError变量为true,则应用text-danger,显示为红色;否则,显示为默认颜色,黑色。
    [ngClass]="messageClasses"> 只应用messageClasses集合中结果为true的类,如果有两个以及的变量为true,则同时应用于该标签。必须"text-danger"和"text-special"为true,显示为斜体红色。

        效果图如下:

    3. Style Binding

       Style Binding是对 css 中的style进行绑定,方法和Class Binding相似。直接贴代码:

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'app-test',
      template: `
        <h2>
          Welcome {{name}}
        </h2>
            
        <h2 [style.color] = "hasError ? 'red':'green'">
          Style Binding
        </h2>
    
        <h2 [style.color] = "highlightColor">
          Style Binding2
        </h2>
        <h2 [ngStyle] = "titleStyles">
        Style Binding3
      </h2>
    
        `
     ,
      styles: []
    })
    export class TestComponent implements OnInit {
    
      public name = "Dan";
      public highlightColor = "orange"
      public titleStyles = {
        color: "blue",
        fontStyle: "italic"
      }
      constructor() { }
    
      ngOnInit() {
      }
    
    }

        效果图如下:

    二、事件绑定和双向绑定 Event Binding & Two Ways Binding

    通过点击按钮,改变类中的变量,在呈现到视图上,这个过程就是一种事件绑定。粉色代码处为事件绑定。

    实时监视UI的控件,若有值的变化,变量可以接收到此变化,并重新分配该值,再自动把该值更新到视图,这就是双向绑定。蓝色代码处为双向绑定。

    temp.component.ts

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'app-temp',
      template: `
        <button (click) = "onClick($event)">Greet</button>
        <button (click) = "greeting = 'inline Greet!!'">Greet2</button>
        <p>{{greeting}}</p>
        
        <input [(ngModel)] = "name" type="text">
        {{name}}
      `,
      styles: []
    })
    export class TempComponent implements OnInit {
    
      public name = "";
      public greeting = "";
    
      onClick(event){
        this.greeting = 'Greeting!!';
        //console.log(event);
        console.log(event.type);
      }
    
      constructor() { }
    
      ngOnInit() {
      }
    
    }

    Angular不能直接识别ngModel,需要通过一个单独的模块FormsModule来访问,因此我们要引用这个模块,即在app.module.ts里import  FormsModule,如下代码:

    app.module.ts

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import {FormsModule} from '@angular/forms';
    
    import { AppComponent } from './app.component';
    import { TestComponent } from './test/test.component';
    import { TempComponent } from './temp/temp.component';
    
    
    
    @NgModule({
      declarations: [
        AppComponent,
        TestComponent,
        TempComponent
      ],
      imports: [
        BrowserModule,
        FormsModule
      ],
      providers: [],
      bootstrap: [AppComponent]
    })
    export class AppModule { }

    效果图如下:

    本集完结,期待下一集,撒花~

  • 相关阅读:
    014-More than one file was found with OS independent path 'META-INF/DEPENDENCIES'
    013-一个Activity怎么调用另一个Activity的方法返回数据(转)
    012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)
    011-frament中不能调用getSystemService()方法
    010-Android开发解决控件超出屏幕,不能正常显示的问题
    009-在Fragment中实现Activity跳转功能
    Oracle分区表
    Oracle构造列
    Oracle集合
    Oracle多对多、维表
  • 原文地址:https://www.cnblogs.com/yidansheng/p/8721047.html
Copyright © 2011-2022 走看看