select每選擇一個option選項減少對應(yīng)的option實現(xiàn)方法
引言
對人員投票進(jìn)行排名的場景中,會有select框讓用戶選擇每個名次對應(yīng)的人員,該select框需要實現(xiàn)每選擇一個option(人員)選項中將減少對應(yīng)的option(人員)。
效果瀏覽
想法
對表單的值變化進(jìn)行訂閱,將已選中的人放入新數(shù)組中,對數(shù)組進(jìn)行遍歷,根據(jù)id將所有選中的人過濾掉。
實現(xiàn)步驟
根據(jù)人員數(shù)量生成對應(yīng)數(shù)量的select框
formGroup = new FormGroup({}); constructor(private fb: FormBuilder) { } createForm() : void{ for(let i = 1; i <= this.members.length; i++) { this.formGroup.addControl(`${i}`, this.fb.control(null)) } }
FormBuilder 提供了一個語法糖,以簡化 FormControl、FormGroup 或 FormArray 實例的創(chuàng)建過程。 它會減少構(gòu)建復(fù)雜表單時所需的樣板代碼的數(shù)量。
class FormBuilder { group(controlsConfig: {...}, extra: {...}): FormGroup control(formState: any, validator?: ValidatorFn | ValidatorFn[] | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null): FormControl array(controlsConfig: any[], validator?: ValidatorFn | ValidatorFn[] | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null): FormArray }
group: 構(gòu)建一個新的 FormGroup 實例。
this.form = this.fb.group({ name: '123', age: 9, gender: false })
control(): 構(gòu)建一個新的 FormControl 實例。
this.formGroup.addControl(`${i}`, this.fb.control(null))
array(): 構(gòu)造一個新的 FormArray 實例。
form: FormArray = new FormArray<any>([ this.fb.control(null), this.fb.control(null), this.fb.control(null), ]);
數(shù)據(jù)綁定
<app-member-select [members]="users" formControlName="{{ i + 1 }}"></app-member-select>
MemberSelectComponent組件:
import {Component, forwardRef, Input, OnInit, Output} from '@angular/core'; import {ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR} from "@angular/forms"; import {User} from "../../../entity/user"; import {BehaviorSubject} from "rxjs"; import {UserService} from "../../../service/user.service"; import {EventEmitter} from "protractor"; import {Assert} from "@yunzhi/utils"; @Component({ selector: 'app-member-select', templateUrl: './member-select.component.html', styleUrls: ['./member-select.component.css'], providers: [{ provide: NG_VALUE_ACCESSOR, multi: true, useExisting: forwardRef(() => MemberSelectComponent) }] }) export class MemberSelectComponent implements OnInit, ControlValueAccessor { @Input() members: User[] = []; memberSelect = new FormControl<User>(null); ngOnInit(): void { } /** * 子組件需要向父組件彈值時,直接調(diào)用參數(shù)的fn方法 * 相當(dāng)于@Ouput() * @param fn 此類型取決于當(dāng)前組件的彈出值類型 */ registerOnChange(fn: (user: User) => void): void { this.memberSelect.valueChanges.subscribe((data => { fn(data); })); } registerOnTouched(fn: any): void { } /** * 將FormControl中的值通過此方法寫入 * FormControl的值每變換一次,該方法被重新執(zhí)行一次 * 相當(dāng)于@Input set XXX */ writeValue(user: User): void { if (user === null) { return; } this.memberSelect.setValue(user); } /** * 比較函數(shù),標(biāo)識用哪個字段來比較兩個對象是否為同一個對象 * @param t1 源 * @param t2 目標(biāo) */ compareFn(t1: { id: number }, t2: { id: number }): boolean { return t1 && t2 ? t1.id === t2.id : t1 === t2; } }
獲取已選擇的人員進(jìn)行過濾
this.formGroup.valueChanges.subscribe(v => { let idsToFilter: number[] = []; // 遍歷 v 的屬性,如果屬性值不為 null,則將其 id 加入數(shù)組 for (const key in v) { if (v[key] !== null && v[key].id !== undefined) { idsToFilter.push(v[key].id); } } // 過濾掉與 idsToFilter 中任何一個 id 相同的元素 this.users = this.members.filter(member => !idsToFilter.includes(member.id)); })
目標(biāo)效果就達(dá)成,希望這篇文章對你有所幫助,更多關(guān)于select option選項減少的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決layui動態(tài)添加的元素click等事件觸發(fā)不了的問題
今天小編就為大家分享一篇解決layui動態(tài)添加的元素click等事件觸發(fā)不了的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS switch判斷 三目運算 while 及 屬性操作代碼
這篇文章主要介紹了JS switch判斷 三目運算 while 及 屬性操作代碼,需要的朋友可以參考下2017-09-09原生javascript實現(xiàn)獲取指定元素下所有后代元素的方法
這篇文章主要介紹了原生javascript實現(xiàn)獲取指定元素下所有后代元素的方法,在進(jìn)行web程序設(shè)計時是非常實用的技巧,需要的朋友可以參考下2014-10-10元素的內(nèi)聯(lián)事件處理函數(shù)的特殊作用域在各瀏覽器中存在差異
在一個元素的屬性中綁定事件,實際上就創(chuàng)建了一個內(nèi)聯(lián)事件處理函數(shù)(如<h1 onclick="alert(this);"...>...</h1>),內(nèi)聯(lián)事件處理函數(shù)有其特殊的作用域鏈,并且各瀏覽器的實現(xiàn)細(xì)節(jié)也有差異。2011-01-01JavaScript獲取GridView中用戶點擊控件的行號,列號
GridView中的某幾列有按鈕,需要獲取用戶當(dāng)前點的按鈕的行號(捎帶的得到列號)2009-04-04JavaScript JSON.stringify()的使用總結(jié)
JSON是一種輕量級數(shù)據(jù)格式,可以方便地表示復(fù)雜數(shù)據(jù)結(jié)構(gòu)。JSON對象有兩個方法:stringify()和parse()。在簡單的情況下,這兩個方法分別可以將JavaScript序列化為JSON字符串,以及將JSON解析為原生JavaScript值。本文著重介紹JSON.stringify()的使用方法和注意事項。2021-05-05