ionic3 自定義購(gòu)物加減組件

1. 創(chuàng)建組件

執(zhí)行命令

$ ionic g component ion-meter

成功后如圖


圖片.png
2.修改組件

ion-meter.ts

import { Component, Input, OnChanges, OnInit, Output, EventEmitter, ViewChild } from '@angular/core';

/**
 * Generated class for the IonMeterComponent component.
 *
 * See https://angular.io/api/core/Component for more info on Angular
 * Components.
 */
@Component({
  selector: 'ion-meter',
  templateUrl: 'ion-meter.html'
})
export class IonMeterComponent implements OnChanges, OnInit {

  @ViewChild('input') input: any;

  @Output()
  onUpdate = new EventEmitter<any>();//數(shù)據(jù)改變通知

  @Input("buyNumber")
  buyNumber: any= 1;//購(gòu)買(mǎi)數(shù)

  @Input("goods")
  goods: any = '';//商品數(shù)據(jù),用來(lái)判斷所修改的數(shù)量屬于哪個(gè)商品

  @Input("maxQty")
  maxQty: number;//最大限制數(shù)

  @Input("minQty")
  minQty: number = 1;//最小購(gòu)買(mǎi)數(shù),默認(rèn)0

  disabled: boolean = false;//是否禁止輸入洼怔,默認(rèn)允許
  minus: boolean = true;//是否禁用減按鈕
  add: boolean = false;//是否禁用加按鈕

  constructor() {
  }

  /**
   * 初始化
   */
  ngOnInit() {

  }

  /**
   * input輸入事件
   */
  onInput(event) {
    event.stopPropagation();
    this.buyNumber = this.buyNumber.replace(/[^0-9]/ig, "");
    this.input.nativeElement.value = this.buyNumber;
    if (this.maxQty && Number(this.buyNumber) >= this.maxQty) {
      this.add = true;
      if (this.maxQty > this.minQty) {
        this.minus = false;
      }
      this.buyNumber = this.maxQty;
      this.onEvent();
      this.input.nativeElement.value = this.buyNumber;
      return;
    }
    //判斷是否禁用減按鈕
    if (this.buyNumber && this.buyNumber > this.minQty) {
      this.minus = false;
    } else {
      this.minus = true;
    }

    this.onEvent();
  }

  /**
   * 減事件
   */
  onMinus(event) {
    event.stopPropagation();

    if (this.buyNumber && this.buyNumber > this.minQty) {
      this.buyNumber--;
      //判斷是否禁用減按鈕
      if (this.buyNumber == this.minQty) {
        this.minus = true;
      }
      if (this.maxQty && this.buyNumber < this.maxQty) {
        this.add = false;
      }
      this.onEvent();
    }
  }

  /**
   * 加事件
   */
  onAdd(event) {
    event.stopPropagation();
    if (this.maxQty && this.buyNumber >= this.maxQty) {
      this.add = true;
      return;
    }
    this.buyNumber++;
    this.onEvent();
    this.minus = false;
  }

  /**
   * 向父組件傳遞事件
   */
  onEvent() {
    this.onUpdate.emit({ number: this.buyNumber, goods: this.goods });
  }

  /**
   * input點(diǎn)擊事件,阻止冒泡
   */
  onMyInput(event) {
    event.stopPropagation();
  }

  /**
   * 數(shù)據(jù)變化事件
   */
  ngOnChanges() {
    this.maxQty = Number(this.maxQty);
    this.buyNumber = Number(this.buyNumber);
    if (this.buyNumber > this.minQty) {
      this.minus = false;
    }

    if (this.maxQty && this.buyNumber >= this.maxQty) {
      this.add = true;
    }

  }
}

ion-meter.html

<!-- Generated template for the IonMeterComponent component -->
<ion-row >
    <ion-col col-6  >
        <samp >數(shù)量:</samp>
    </ion-col>

    <ion-col col-2>
        <button ion-button [disabled]='minus || disabled' (click)="onMinus($event)" clear>
            <ion-icon name="remove-circle" color="primary" ></ion-icon>
        </button>
    </ion-col>

    <ion-col col-2> 
        <input [(ngModel)]="buyNumber" (input)="onInput($event)" (click)="onMyInput($event)" [disabled]='disabled' #input >
    </ion-col>

    <ion-col col-2 text-right>
         <button ion-button [disabled]='add || disabled' (click)="onAdd($event)" clear>
            <ion-icon name="add-circle" color="primary"></ion-icon>
        </button>
    </ion-col>
</ion-row>

ion-meter.scss

ion-meter {
    samp{
        height: 30px;
        line-height: 30px;
        font-size: 1.2rem;
    }
    input{
        width: 100%;
        height: 100%;
        font-size: 1.8rem;
        text-align: center;
        cursor: pointer;
        border-width: 0;
        outline:none;
    }
    .button {
        height: inherit; 
        margin: 0; 
        padding: 0; 
    }
    ion-icon {
        font-size: 1.8em;
    }
}

3. 調(diào)用

以懶加載頁(yè)面為例
在所需頁(yè)面的module里導(dǎo)入CompoentsModule


圖片.png

這樣頁(yè)面才能正常使用
在頁(yè)面的html

 <ion-meter buyNumber='2' maxQty='10' minQty='1' goods="A001" (onUpdate)="onUpdate($event)"></ion-meter>

頁(yè)面的ts里添加函數(shù)接收數(shù)據(jù)更改后回調(diào)

 /**
 * 數(shù)量變化回調(diào)
 */
  onUpdate(data) {
    console.log(data);
  }
4. 效果
圖片.png

也可多個(gè)


圖片.png

當(dāng)輸入所達(dá)到的最小數(shù)量時(shí)蜈出,減按鈕會(huì)進(jìn)行禁用,反之亦然


圖片.png
圖片.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宝踪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拨拓,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氓栈,死亡現(xiàn)場(chǎng)離奇詭異渣磷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)授瘦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)醋界,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)竟宋,“玉大人,你說(shuō)我怎么就攤上這事形纺∏鹣溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逐样,是天一觀的道長(zhǎng)婉陷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)官研,這世上最難降的妖魔是什么秽澳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮戏羽,結(jié)果婚禮上担神,老公的妹妹穿的比我還像新娘。我一直安慰自己始花,他們只是感情好妄讯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著酷宵,像睡著了一般亥贸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浇垦,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天炕置,我揣著相機(jī)與錄音,去河邊找鬼男韧。 笑死朴摊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的此虑。 我是一名探鬼主播甚纲,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼朦前!你這毒婦竟也來(lái)了介杆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤韭寸,失蹤者是張志新(化名)和其女友劉穎春哨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棒仍,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悲靴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞尚。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耸三,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浇揩,到底是詐尸還是另有隱情仪壮,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布胳徽,位于F島的核電站积锅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏养盗。R本人自食惡果不足惜缚陷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望往核。 院中可真熱鬧箫爷,春花似錦、人聲如沸聂儒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衩婚。三九已至窜护,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間非春,已是汗流浹背柱徙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留税娜,地道東北人坐搔。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓藏研,卻偏偏與公主長(zhǎng)得像敬矩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蠢挡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容