欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Angular4自制一個(gè)市縣二級(jí)聯(lián)動(dòng)組件示例

 更新時(shí)間:2017年11月21日 14:24:57   作者:丶淡戀小情緒x  
本篇文章主要介紹了Angular4自制一個(gè)市縣二級(jí)聯(lián)動(dòng)組件示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近遇到了不少問(wèn)題,真的是命運(yùn)多舛。Angular真是讓人又愛(ài)又恨的框架,恨的是資料太少,遇到問(wèn)題無(wú)從下手。愛(ài)的是許多其他框架難以做到的功能,angular卻可以輕松做到。

話不多說(shuō),最近遇到了一個(gè)舊項(xiàng)目改造的問(wèn)題。拿到前同事做的頁(yè)面效果:

第一眼就看到了這三個(gè)下拉框,按捺不住好奇心的我點(diǎn)了點(diǎn)。原來(lái),第一個(gè)下拉框可以選擇市屬和省屬,如果選擇市屬,那么后面就會(huì)出現(xiàn)市、縣級(jí)兩個(gè)下拉框,如果是省屬,那就隱藏了,這個(gè)挺容易的。然后就是要選擇市之后,區(qū)下拉框要有對(duì)應(yīng)區(qū)縣選項(xiàng)。emmmm,很典型的二級(jí)聯(lián)動(dòng),不過(guò)既然分析完了思路,那就開(kāi)始做吧!首先呢,數(shù)據(jù)肯定要從后端同事那里拿,調(diào)用他的接口把數(shù)據(jù)填充進(jìn)去??纯磾?shù)據(jù)是什么樣子的:


數(shù)據(jù)略多,就不全部貼出來(lái)了。把實(shí)體bean創(chuàng)建一下,

// 市級(jí)實(shí)體類
export class City {

  // 市級(jí)id
  cityId: string;

  // 所屬類型(0.市屬 1.省屬)
  cityType: number;

  // 市級(jí)名稱(可選屬性,若cityType為1時(shí),可不填)
  cityName: string;

  // 所屬區(qū)縣
  counties?: Array<Country>;

}

// 區(qū)縣級(jí)實(shí)體類
export class Country {

  // 區(qū)縣id
  countryId: string;

  // 區(qū)縣名稱
  countryName: string;

}

// 填寫(xiě)市縣類
export class CityAndCountry {

  // 市級(jí)id
  cityId: string;

  // 縣級(jí)id
  countryId: string;

  // 市級(jí)類型
  cityType: number;

  // 市縣級(jí)實(shí)體構(gòu)造器 
  constructor() {
    // 給市級(jí)id賦予一個(gè)真實(shí)城市的id初始值
    this.cityId = '***';
    // 同上
    this.countryId = '***';
    // 同上
    this.cityType = 0;
  }
}

實(shí)體完成了,開(kāi)始準(zhǔn)備獲取數(shù)據(jù)并填充至實(shí)體:

// 二級(jí)聯(lián)動(dòng)組件
export class CityAreaComponent implements OnInit, OnDestroy {

  // 結(jié)果碼 (用于頁(yè)面處理顯示標(biāo)識(shí))
  result_code: number;

  // 市級(jí)實(shí)體聲明
  city: City[];

  // 縣區(qū)級(jí)實(shí)體聲明
  country: Country[];

  // 市縣、區(qū)級(jí)填寫(xiě)實(shí)體聲明
  cac: CityAndCountry;

  // 聲明訂閱對(duì)象
  subscript: Subscription;

  /**
  * 構(gòu)造器
  * @param {CityService} service 注入服務(wù)
  */
  constructor (private service: CityService) {
    // 結(jié)果碼 (-1.網(wǎng)絡(luò)或其他異常 0.無(wú)內(nèi)容 1.請(qǐng)求成功 2.請(qǐng)等待)
    this.result_code = 2;
    // 初始化填寫(xiě)市區(qū)、縣級(jí)填寫(xiě)實(shí)體
    cac = new CityAndCountry();
    // 初始化數(shù)組(這步很重要,有很多人說(shuō)使用數(shù)組相關(guān)函數(shù)會(huì)報(bào)未定義異常,是因?yàn)闆](méi)有初始化的原因)
    this.city = [];
    this.country = [];
    // 初始化訂閱對(duì)象
    this.subscript = new Subscription();
  }

  /**
  * 生命周期初始化鉤子(生命周期盡量按執(zhí)行順序來(lái)寫(xiě),養(yǎng)成好習(xí)慣)
  */
  ngOnInit(): void {
    this.getCityArea();
  }

  /** 獲取市縣數(shù)據(jù) */
  getCityArea() {
    /** 將請(qǐng)求交付服務(wù)處理(service代碼比較簡(jiǎn)單,就不貼了) */
    this.subscript = this.service.getCityArea().subscribe(res => {
      /** 獲取json請(qǐng)求結(jié)果 */
      const result = res.json();
      /** 判斷結(jié)果返回碼 */
      switch (result['code']) {
        /** 請(qǐng)求成功,并且有值 */
        case 200:
        /** 改變初始返回碼 */
        this.result_code = 1;
        /** 獲取并填充數(shù)據(jù) */
        this.city = json['city'];
        break;
        /** 其他情況不重復(fù)贅述 */
      }
    }, err => {
      /** 顯示預(yù)設(shè)異常信息提示給用戶 */
      this.result_code = -1;
      /** 打印log,盡量使用日志產(chǎn)出 */
      console.error(err);
    });
  }

  /** 生命周期銷毀鉤子 */
  ngOnDestroy(): void {
    /** 取消訂閱 */
    this.subscript.unsubscribe();
  }
}

由于此處是單服務(wù)請(qǐng)求,為了讓代碼比較清晰直觀,這里我就不做封裝處理了。數(shù)據(jù)獲取了之后就該填充到展示界面了:

<!-- 所屬類型(此處固定,一般為獲取后端數(shù)據(jù)字典數(shù)據(jù)) -->
<select class="city_type" [value]="cac.cityType" [(ngModel)]="cac.cityType">
  <!-- 所傳內(nèi)容為整數(shù)型 -->
  <option value=0>市屬</option>
  <option value=1>省屬</option>
</select>

<!-- 市級(jí)選擇(類型為省屬時(shí)隱藏) -->
<select class="city" [value]="cac.cityId" [(ngModel)]="cac.cityId" *ngIf="city.cityType==0">
  <!-- 遍歷城市數(shù)組 -->
  <option *ngFor="let opt of option" [value]="opt.cityId">{{opt.cityName}}</option>
</select>

這時(shí)候,我們發(fā)現(xiàn)縣級(jí)獲取起來(lái)好像并不能直接獲取,怎么辦呢?我突然想到,我在ts里面聲明一個(gè)變量獲取市級(jí)選擇的id號(hào),然后再拿id去找下屬縣區(qū),這樣就可以輕松拿到了。既然要實(shí)時(shí)獲取變化,那我們就實(shí)現(xiàn)檢測(cè)變化鉤子:

// 二級(jí)聯(lián)動(dòng)組件
export class CityAreaComponent implements OnInit, OnDestroy, DoCheck{
  // 聲明縣區(qū)級(jí)數(shù)組
  country: Array<Country>;

  constructor() {
    /** 重復(fù)代碼不贅述 */
    /** 初始化數(shù)組 */
    country = [];
  }  

  /** 生命周期檢測(cè)變化鉤子 */
  ngDoCheck(): void {
    /** 遍歷市級(jí)數(shù)組 */
    for (let i = 0; i < this.city.length; i++) {
      /** 若選擇的市級(jí)id和市級(jí)數(shù)組中的id相吻合 */
      if (this.city[i].id == this.cac.countryId) {
        /** 將該索引下的counties數(shù)組賦予給區(qū)縣級(jí)數(shù)組 */
        this.country = this.city[i].counties;
      }
      /** 我們無(wú)法避免直轄市的情況,所以多一重判斷 */
      if (this.country.length > 0) {
        /** 為了用戶體驗(yàn),我們要盡量在用戶選擇市級(jí)城市后,默認(rèn)選擇一個(gè)區(qū)縣級(jí)城市 */
        this.cac.country.id = this.country[0].id;
      }
    }
  }
}

最后再補(bǔ)上區(qū)縣級(jí)下拉框:

<!-- 區(qū)縣級(jí)下拉框 -->
<select [value]="cac.countryId" [(ngModel)]="cac.countryId" *ngIf="cac.cityType==0 && country.length > 0">
  <option *ngFor="let count of country" [value]="count.id">{{count.name}}</option>
</select>

到此為止,大功告成,再也不用去依賴別人的庫(kù)了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • AngularJS中實(shí)現(xiàn)動(dòng)畫(huà)效果的方法

    AngularJS中實(shí)現(xiàn)動(dòng)畫(huà)效果的方法

    本文主要介紹AngularJS 動(dòng)畫(huà),這里對(duì)動(dòng)畫(huà)的資料詳細(xì)介紹并附有效果圖和代碼實(shí)例,有需要的小伙伴參考下
    2016-07-07
  • AngularJS HTML編譯器介紹

    AngularJS HTML編譯器介紹

    這篇文章主要介紹了AngularJS HTML編譯器介紹,AngularJS的HTML編譯器能讓瀏覽器識(shí)別新的HTML語(yǔ)法。它能讓你將行為關(guān)聯(lián)到HTML元素或者屬性上,甚至能讓你創(chuàng)造具有自定義行為的新元素,需要的朋友可以參考下
    2014-12-12
  • 模板視圖和AngularJS之間沖突的解決方法

    模板視圖和AngularJS之間沖突的解決方法

    這篇文章主要介紹了模板視圖和AngularJS之間沖突的解決方法,結(jié)合實(shí)例形式分析了AngularJS模板視圖沖突的原因并給出了2種解決方法供大家參考使用,需要的朋友可以參考下
    2016-11-11
  • Angular.js前臺(tái)傳list數(shù)組由后臺(tái)spring MVC接收數(shù)組示例代碼

    Angular.js前臺(tái)傳list數(shù)組由后臺(tái)spring MVC接收數(shù)組示例代碼

    這篇文章主要給大家介紹了關(guān)于Angular.js前臺(tái)傳list數(shù)組之后,由后臺(tái)spring MVC接收數(shù)組的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • Angular 4依賴注入學(xué)習(xí)教程之組件服務(wù)注入(二)

    Angular 4依賴注入學(xué)習(xí)教程之組件服務(wù)注入(二)

    大家都知道依賴注入式AngularJS的重要特性之一,之前我們已經(jīng)介紹了關(guān)于Angular 4依賴注入基礎(chǔ)的內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于Angular 4依賴注入之組件服務(wù)注入的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • angularjs http與后臺(tái)交互的實(shí)現(xiàn)示例

    angularjs http與后臺(tái)交互的實(shí)現(xiàn)示例

    這篇文章主要介紹了angularjs http與后臺(tái)交互的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 淺談AngularJs指令之scope屬性詳解

    淺談AngularJs指令之scope屬性詳解

    下面小編就為大家?guī)?lái)一篇淺談AngularJs指令之scope屬性詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Angular2庫(kù)初探

    Angular2庫(kù)初探

    本文將側(cè)重點(diǎn)放到npm上來(lái),看看npm平臺(tái)給ng2帶來(lái)的酷炫的幫助。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • Angular directive遞歸實(shí)現(xiàn)目錄樹(shù)結(jié)構(gòu)代碼實(shí)例

    Angular directive遞歸實(shí)現(xiàn)目錄樹(shù)結(jié)構(gòu)代碼實(shí)例

    本篇文章主要介紹了Angular directive遞歸實(shí)現(xiàn)目錄樹(shù)結(jié)構(gòu)代碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • angular *Ngif else用法詳解

    angular *Ngif else用法詳解

    這篇文章主要介紹了angular *Ngif else用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論