国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Angular 2.x 從 0 到 1 (二)史上最簡單的 Angular2 教程

warkiz / 2003人閱讀

摘要:下面我們看看如果使用是什么樣子的,首先我們需要在組件的修飾器中配置,然后在組件的構(gòu)造函數(shù)中使用參數(shù)進(jìn)行依賴注入。

第一節(jié):Angular 2.0 從0到1 (一)
第二節(jié):Angular 2.0 從0到1 (二)
第三節(jié):Angular 2.0 從0到1 (三)

第二節(jié):用Form表單做一個登錄控件 對于login組件的小改造

hello-angularsrcapploginlogin.component.ts 中更改其模板為下面的樣子

import { Component, OnInit } from "@angular/core";

@Component({
  selector: "app-login",
  template: `
    
`, styles: [] }) export class LoginComponent implements OnInit { constructor() { } ngOnInit() { } }

我們增加了一個文本輸入框和一個按鈕,保存后返回瀏覽器可以看到結(jié)果

接下來我們嘗試給Login按鈕添加一個處理方法 (click)表示我們要處理這個button的click事件,圓括號是說發(fā)生此事件時,調(diào)用等號后面的表達(dá)式或函數(shù)。等號后面的onClick()是我們自己定義在LoginComponent中的函數(shù),這個名稱你可以隨便定成什么,不一定叫onClick()。下面我們就來定義這個函數(shù),在LoginComponent中寫一個叫onClick()的方法,內(nèi)容很簡單就是把“button was clicked”輸出到Console。

  onClick() {
    console.log("button was clicked");
  }

返回瀏覽器,并按F12調(diào)出開發(fā)者工具。當(dāng)你點擊Login時,會發(fā)現(xiàn)Console窗口輸出了我們期待的文字。

那么如果要在onClick中傳遞一個參數(shù),比如是上面的文本輸入框輸入的值怎么處理呢?我們可以在文本輸入框標(biāo)簽內(nèi)加一個#usernameRef,這個叫引用(reference)。注意這個引用是的input對象,我們?nèi)绻雮鬟finput的值,可以用usernameRef.value,然后就可以把onClick()方法改成onClick(usernameRef.value)

在Component內(nèi)部的onClick方法也要隨之改寫成一個接受username的方法

  onClick(username) {
    console.log(username);
  }

現(xiàn)在我們再看看結(jié)果是什么樣子,在文本輸入框中鍵入“hello”,點擊Login按鈕,觀察Console窗口:hello被輸出了。

好了,現(xiàn)在我們再加一個密碼輸入框,然后改寫onClick方法可以同時接收2個參數(shù):用戶名和密碼。代碼如下:

import { Component, OnInit } from "@angular/core";

@Component({
  selector: "app-login",
  template: `
    
`, styles: [] }) export class LoginComponent implements OnInit { constructor() { } ngOnInit() { } onClick(username, password) { console.log("username:" + username + " " + "password:" + password); } }

看看結(jié)果吧,在瀏覽器中第一個輸入框輸入“wang”,第二個輸入框輸入“1234567”,觀察Console窗口,Bingo!

建立一個服務(wù)去完成業(yè)務(wù)邏輯

如果我們把登錄的業(yè)務(wù)邏輯在onClick方法中完成,當(dāng)然也可以,但是這樣做的耦合性太強(qiáng)了。設(shè)想一下,如果我們增加了微信登錄、微博登錄等,業(yè)務(wù)邏輯會越來越復(fù)雜,顯然我們需要把這個業(yè)務(wù)邏輯分離出去。那么我們接下來創(chuàng)建一個AuthService吧, 首先我們在srcapp下建立一個core的子文件夾(srcappcore),然后命令行中輸入 ng g s coreauth (s這里是service的縮寫,coreauth是說在core的目錄下建立auth服務(wù)相關(guān)文件)。auth.service.tsauth.service.spec.ts這個兩個文件應(yīng)該已經(jīng)出現(xiàn)在你的目錄里了。

下面我們?yōu)檫@個service添加一個方法,你可能注意到這里我們?yōu)檫@個方法指定了返回類型和參數(shù)類型。這就是TypeScript帶來的好處,有了類型約束,你在別處調(diào)用這個方法時,如果給出的參數(shù)類型或返回類型不正確,IDE就可以直接告訴你錯了。

import { Injectable } from "@angular/core";

@Injectable()
export class AuthService {

  constructor() { }

  loginWithCredentials(username: string, password: string): boolean {
    if(username === "wangpeng")
      return true;
    return false;
  }

}

等一下,這個service雖然被創(chuàng)建了,但仍然無法在Component中使用。當(dāng)然你可以在Component中import這個服務(wù),然后實例化后使用,但是這樣做并不好,仍然時一個緊耦合的模式,Angular2提供了一種依賴性注入(Dependency Injection)的方法。

什么是依賴性注入?

如果不使用DI(依賴性注入)的時候,我們自然的想法是這樣的,在login.component.ts中import引入AuthService,在構(gòu)造中初始化service,在onClick中調(diào)用service。

import { Component, OnInit } from "@angular/core";
//引入AuthService
import { AuthService } from "../core/auth.service";

@Component({
  selector: "app-login",
  template: `
    
`, styles: [] }) export class LoginComponent implements OnInit { //聲明成員變量,其類型為AuthService service: AuthService; constructor() { this.service = new AuthService(); } ngOnInit() { } onClick(username, password) { //調(diào)用service的方法 console.log("auth result is: " + this.service.loginWithCredentials(username, password)); } }

這么做呢也可以跑起來,但存在幾個問題:

由于實例化是在組件中進(jìn)行的,意味著我們?nèi)绻膕ervice的構(gòu)造函數(shù)的話,組件也需要更改。

如果我們以后需要開發(fā)、測試和生產(chǎn)環(huán)境配置不同的AuthService,以這種方式實現(xiàn)會非常不方便。

下面我們看看如果使用DI是什么樣子的,首先我們需要在組件的修飾器中配置AuthService,然后在組件的構(gòu)造函數(shù)中使用參數(shù)進(jìn)行依賴注入。

import { Component, OnInit } from "@angular/core";
import { AuthService } from "../core/auth.service";

@Component({
  selector: "app-login",
  template: `
    
`, styles: [], //在providers中配置AuthService providers:[AuthService] }) export class LoginComponent implements OnInit { //在構(gòu)造函數(shù)中將AuthService示例注入到成員變量service中 //而且我們不需要顯式聲明成員變量service了 constructor(private service: AuthService) { } ngOnInit() { } onClick(username, password) { console.log("auth result is: " + this.service.loginWithCredentials(username, password)); } }

看到這里你會發(fā)現(xiàn)我們?nèi)匀恍枰猧mport相關(guān)的服務(wù),這是import是要將類型引入進(jìn)來,而provider里面會配置這個類型的實例。當(dāng)然即使這樣還是不太爽,可不可以不引入AuthService呢?答案是可以。

我們看一下app.module.ts,這個根模塊文件中我們發(fā)現(xiàn)也有個providers,根模塊中的這個providers是配置在模塊中全局可用的service或參數(shù)的。

providers: [
    {provide: "auth",  useClass: AuthService}
    ]

providers是一個數(shù)組,這個數(shù)組呢其實是把你想要注入到其他組件中的服務(wù)配置在這里。大家注意到我們這里的寫法和上面優(yōu)點區(qū)別,沒有直接寫成

providers:[AuthService]

而是給出了一個對象,里面有兩個屬性,provide和useClass,provide定義了這個服務(wù)的名稱,有需要注入這個服務(wù)的就引用這個名稱就好。useClass指明這個名稱對應(yīng)的服務(wù)是一個類,本例中就是AuthService了。這樣定義好之后,我們就可以在任意組件中注入這個依賴了。下面我們改動一下login.component.ts,去掉頭部的import { AuthService } from "../core/auth.service";和組件修飾器中的providers,更改其構(gòu)造函數(shù)為

onstructor(@Inject("auth") private service) {
  }

我們?nèi)サ袅藄ervice的類型聲明,但加了一個修飾符@Inject("auth"),這個修飾符的意思是請到系統(tǒng)配置中找到名稱為auth的那個依賴注入到我修飾的變量中。當(dāng)然這樣改完后你會發(fā)現(xiàn)Inject這個修飾符系統(tǒng)不識別,我們需要在@angular/core中引用這個修飾符,現(xiàn)在login.component.ts看起來應(yīng)該是下面這個樣子

import { Component, OnInit, Inject } from "@angular/core";

@Component({
  selector: "app-login",
  template: `
    
`, styles: [] }) export class LoginComponent implements OnInit { constructor(@Inject("auth") private service) { } ngOnInit() { } onClick(username, password) { console.log("auth result is: " + this.service.loginWithCredentials(username, password)); } }
雙向數(shù)據(jù)綁定

接下來的問題是我們是否只能通過這種方式進(jìn)行表現(xiàn)層和邏輯之間的數(shù)據(jù)交換呢?如果我們希望在組件內(nèi)對數(shù)據(jù)進(jìn)行操作后再反饋到界面怎么處理呢?Angular2提供了一個雙向數(shù)據(jù)綁定的機(jī)制。這個機(jī)制是這樣的,在組件中提供成員數(shù)據(jù)變量,然后在模板中引用這個數(shù)據(jù)變量。我們來改造一下login.component.ts,首先在class中聲明2個數(shù)據(jù)變量username和password。

  username = "";
  password = "";

然后去掉onClick方法的參數(shù),并將內(nèi)部的語句改造成如下樣子:

console.log("auth result is: "
      + this.service.loginWithCredentials(this.username, this.password));

去掉參數(shù)的原因是雙向綁定后,我們通過數(shù)據(jù)成員變量就可以知道用戶名和密碼了,不需要在傳遞參數(shù)了。而成員變量的引用方式是this.成員變量
然后我們來改造模板:

    

[(ngModel)]="username"這個看起來很別扭,稍微解釋一下,方括號[]的作用是說把等號后面當(dāng)成表達(dá)式來解析而不是當(dāng)成字符串,如果我們?nèi)サ舴嚼ㄌ柲蔷偷扔谡f是直接給這個ngModel賦值成“username”這個字符串了。方括號的含義是單向綁定,就是說我們在組件中給model賦的值會設(shè)置到HTML的input控件中。[()]是雙向綁定的意思,就是說HTML對應(yīng)控件的狀態(tài)的改變會反射設(shè)置到組件的model中。ngModel是FormModule中提供的指令,它負(fù)責(zé)從Domain Model(這里就是username或password,以后我們可用綁定更復(fù)雜的對象)中創(chuàng)建一個FormControl的實例,并將這個實例和表單的控件綁定起來。同樣的對于click事件的處理,我們不需要傳入?yún)?shù)了,因為其調(diào)用的是剛剛我們改造的組件中的onClick方法。現(xiàn)在我們保存文件后打開瀏覽器看一下,效果和上一節(jié)的應(yīng)該一樣的。本節(jié)的完整代碼如下:

//login.component.ts
import { Component, OnInit, Inject } from "@angular/core";

@Component({
  selector: "app-login",
  template: `
    
`, styles: [] }) export class LoginComponent implements OnInit { username = ""; password = ""; constructor(@Inject("auth") private service) { } ngOnInit() { } onClick() { console.log("auth result is: " + this.service.loginWithCredentials(this.username, this.password)); } }
表單數(shù)據(jù)的驗證

通常情況下,表單的數(shù)據(jù)是有一定的規(guī)則的,我們需要依照其規(guī)則對輸入的數(shù)據(jù)做驗證以及反饋驗證結(jié)果。Angular2中對表單驗證有非常完善的支持,我們繼續(xù)上面的例子,在login組件中,我們定義了一個用戶名和密碼的輸入框,現(xiàn)在我們來為它們加上規(guī)則。首先我們定義一下規(guī)則,用戶名和密碼都是必須輸入的,也就是不能為空。更改login.component.ts中的模板為下面的樣子

    
{{usernameRef.valid}} {{passwordRef.valid}}

注意到我們只是為username和password兩個控件加上了required這個屬性,表明這兩個控件為必填項。通過#usernameRef="ngModel"我們重新又加入了引用,這次的引用指向了ngModel,這個引用是要在模板中使用的,所以才加入這個引用如果不需要在模板中使用,可以不要這句。{{表達(dá)式}}雙花括號表示解析括號中的表達(dá)式,并把這個值輸出到模板中。這里我們?yōu)榱丝梢燥@性的看到控件的驗證狀態(tài),直接在對應(yīng)控件后輸出了驗證的狀態(tài)。初始狀態(tài)可以看到2個控件的驗證狀態(tài)都是false,試著填寫一些字符在兩個輸入框中,看看狀態(tài)變化吧。

我們是知道了驗證的狀態(tài)是什么,但是如果我們想知道驗證失敗的原因怎么辦呢?我們只需要將{{usernameRef.valid}}替換成{{usernameRef.errors | json}}|是管道操作符,用于將前面的結(jié)果通過管道輸出成另一種格式,這里就是把errors對象輸出成json格式的意思。看一下結(jié)果吧,返回的結(jié)果如下

如果除了不能為空,我們?yōu)閡sername再添加一個規(guī)則試試看呢,比如字符數(shù)不能少于3。

      


現(xiàn)在我們試著把{{表達(dá)式}}替換成友好的錯誤提示,我們想在有錯誤發(fā)生時顯示錯誤的提示信息。那么我們來改造一下template。

    
{{ usernameRef.errors | json }}
this is required
should be at least 3 charactors
this is required

ngIf也是一個Angular2的指令,顧名思義,是用于做條件判斷的。*ngIf="usernameRef.errors?.required"的意思是當(dāng)usernameRef.errors.requiredtrue時顯示div標(biāo)簽。那么那個?是干嘛的呢?因為errors可能是個null,如果這個時候調(diào)用errorsrequired屬性肯定會引發(fā)異常,那么?就是標(biāo)明errors可能為空,在其為空時就不用調(diào)用后面的屬性了。

如果我們把用戶名和密碼整個看成一個表單的話,我們應(yīng)該把它們放在一對

標(biāo)簽中,類似的加入一個表單的引用formRef

    
this is required
should be at least 3 charactors
this is required

這時運(yùn)行后會發(fā)現(xiàn)原本好用的代碼出錯了,這是由于如果在一個大的表單中,ngModel會注冊成Form的一個子控件,注冊子控件需要一個name,這要求我們顯式的指定對應(yīng)控件的name,因此我們需要為input增加name屬性

    
this is required
should be at least 3 charactors
this is required

既然我們增加了一個formRef,我們就看看formRef.value有什么吧。
首先為form增加一個表單提交事件的處理


然后在組件中增加一個onSubmit方法

  onSubmit(formValue) {
    console.log(formValue);
  }

你會發(fā)現(xiàn)formRef.value中包括了表單所有填寫項的值。

有時候在表單項過多時我們需要對表單項進(jìn)行分組,HTML中提供了fieldset標(biāo)簽用來處理。那么我們看看怎么和Angular2結(jié)合吧:

    
this is required
should be at least 3 charactors
this is required

意味著我們對于fieldset之內(nèi)的數(shù)據(jù)都分組到了login對象中。

接下來我們改寫onSubmit方法用來替代onClick,因為看起來這兩個按鈕重復(fù)了,我們需要去掉onClick。首先去掉template中的,然后把

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81340.html

相關(guān)文章

  • Angular 2.x 01 (一)上最簡單Angular2教程

    摘要:官方支持微軟出品,是的超集,是的強(qiáng)類型版本作為首選編程語言,使得開發(fā)腳本語言的一些問題可以更早更方便的找到。第一個組件那么我們來為我們的增加一個吧,在命令行窗口輸入。引導(dǎo)過程通過在中引導(dǎo)來啟動應(yīng)用。它們的核心就是。 第一節(jié):Angular 2.0 從0到1 (一)第二節(jié):Angular 2.0 從0到1 (二)第三節(jié):Angular 2.0 從0到1 (三) 第一章:認(rèn)識Angular...

    tuniutech 評論0 收藏0
  • Angular 2.x 01 (五)上最簡單Angular2教程

    摘要:如果該構(gòu)造函數(shù)在我們所期望的中運(yùn)行,就沒有任何祖先注入器能夠提供的實例,于是注入器會放棄查找。但裝飾器表示找不到該服務(wù)也無所謂。用處理導(dǎo)航到子路由的情況。路由器會先按照從最深的子路由由下往上檢查的順序來檢查守護(hù)條件。 第一節(jié):Angular 2.0 從0到1 (一)第二節(jié):Angular 2.0 從0到1 (二)第三節(jié):Angular 2.0 從0到1 (三)第四節(jié):Angular 2...

    dcr309duan 評論0 收藏0
  • angular - 收藏集 - 掘金

    摘要:如何在中使用動畫前端掘金本文講一下中動畫應(yīng)用的部分。與的快速入門指南推薦前端掘金是非常棒的框架,能夠創(chuàng)建功能強(qiáng)大,動態(tài)功能的。自發(fā)布以來,已經(jīng)廣泛應(yīng)用于開發(fā)中。 如何在 Angular 中使用動畫 - 前端 - 掘金本文講一下Angular中動畫應(yīng)用的部分。 首先,Angular本生不提供動畫機(jī)制,需要在項目中加入Angular插件模塊ngAnimate才能完成Angular的動畫機(jī)制...

    AlexTuan 評論0 收藏0
  • Angular 2.x 01 (四)上最簡單Angular2教程

    摘要:而且此時我們注意到其實沒有任何一個地方目前還需引用了,這就是說我們可以安全地把從組件中的修飾符中刪除了。 第一節(jié):Angular 2.0 從0到1 (一)第二節(jié):Angular 2.0 從0到1 (二)第三節(jié):Angular 2.0 從0到1 (三) 作者:王芃 wpcfan@gmail.com 第四節(jié):進(jìn)化!模塊化你的應(yīng)用 一個復(fù)雜組件的分拆 上一節(jié)的末尾我偷懶的甩出了大量代碼,可能...

    sanyang 評論0 收藏0
  • 架構(gòu)~微服務(wù)

    摘要:接下來繼續(xù)介紹三種架構(gòu)模式,分別是查詢分離模式微服務(wù)模式多級緩存模式。分布式應(yīng)用程序可以基于實現(xiàn)諸如數(shù)據(jù)發(fā)布訂閱負(fù)載均衡命名服務(wù)分布式協(xié)調(diào)通知集群管理選舉分布式鎖和分布式隊列等功能。 SpringCloud 分布式配置 SpringCloud 分布式配置 史上最簡單的 SpringCloud 教程 | 第九篇: 服務(wù)鏈路追蹤 (Spring Cloud Sleuth) 史上最簡單的 S...

    xinhaip 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<