###### tags: `會議紀錄` ###### Thunder: ###### CodeReview:`新的繼承頁(研究中)` `搜尋元件(SearchUI)` `新寫法(bank/cash *** diff)` ###### Announcement: ###### Attendee: 政儀、永佳、偉恩、弘翊、政儒 # 📌[R]2020/06/09前端會議 ## 踩雷事件 ### ⚡無踩雷事件 ## 寫法交流 ### ⛏新的繼承頁 #### #永佳嘗試撰寫 原因: 目前的繼承架構,與現在的需求越來越不相符,且容易現在開發人員的撰寫,因此希望可以寫新的繼承作業給大家使用。 理想實現是希望,繼承可以提供大家共用畫面及TS 各支程式只需要準備好自己的service就可以了。 > [name=政儀] > 目前的想法非常好,但是依現在的需求來說,要能達到理想狀態幾乎是不可能。 > > 目前我們的產品需求畫面都不是非常一致,因此對於A1目前的需求來說,自己的作業就必須要提供該作業的TS、HTML,否則就算提供大家可以共用的,也還是需要提供各支非共用的作業,但這樣就會跟原本的繼承架構很相似。 ### ⛏新的搜尋元件 #### #政儒寫了searchUI元件 原因: 在某次開發需求調整了原先的搜尋,使搜尋內容的輸入元件(Input)可以依搜尋欄位條件變成下拉元件(select),但沒有注意到傳給後端的條件都會是`%like%`,所以當今天下拉內容(內容值都是傳number)超過10後段回的值就會不正確。 > 政儀:可以將searchFiledChange拿掉,把他setSelectList的功能寫在共用的裡面,然後在各個拿到list值的時候重新=selectList的設定就好,還有我們的專案有做欄位紀錄的功能,因此可能需要加上去。 ==程式碼為調整過後的== .ts ```typescript= import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { StoreService } from '@a1/shared/StoreService'; export enum ESearch { Input, Select } export interface ISearch { /**[搜尋欄位]欄位名稱*/value: string; /**[搜尋欄位]顯示名稱*/name: string; /**[搜尋內容]元件類型*/type: ESearch; /**[搜尋內容]內容資料*/data?: any[]; /**[搜尋內容]唯讀*/disabled?: boolean; } @Component({ selector: 'app-search-ui', templateUrl: './search-ui.component.html', styleUrls: ['./search-ui.component.css'] }) export class SearchUiComponent implements OnInit { // Enum ESearch = ESearch; // Input /**搜尋清單 #搜尋欄位*/ @Input() searchList: Array<ISearch>; // Output /**變更搜尋欄位*/ @Output() searchFieldChange = new EventEmitter(); // 記憶欄位 storeKey = location.hash; storeData = {searchField: '', searchContent: '', selectList: [{ ID: 0, Name: '' }]}; // Param /**搜尋欄位*/ searchField: string = null; /**搜尋內容*/ searchContent: string; /**搜尋內容 #元件類型,預設:Input*/ searchType: ESearch = ESearch.Input; /**搜尋內容 #內容資料*/ selectList: Array<{ ID: number, Name: string }>; /**搜尋內容 #唯讀否*/ isSelectDisabled = false; constructor( public storeService: StoreService ) { } ngOnInit() { // 設定上次查詢的內容 const storeKey = location.hash ? location.hash.split('?')[0] : ''; const storeData = this.storeService.getStorage(storeKey); if (storeData) { this.setSearchField(storeData.searchField); this.setSelectList(storeData.selectList); this.setSearchContent(storeData.searchContent); } } // 搜尋欄位 /**設定搜尋欄位值*/ setSearchField(searchField) { this.searchField = searchField; const isExist = this.searchList.find(x => x.value === this.searchField); if (isExist) { this.searchType = isExist.type; } } /**取得搜尋欄位值*/ getSearchField() { return this.searchField; } /**變更搜尋欄位值*/ onSearchFieldChange() { const isExist = this.searchList.find(x => x.value === this.searchField); if (isExist) { this.searchType = isExist.type; this.selectList = isExist.data; this.isSelectDisabled = !!isExist.disabled; this.searchContent = null; } this.searchFieldChange.emit(); } // 搜尋內容 /**設定下拉選項清單*/ setSelectList(selectList: Array<{ ID: number, Name: string }>) { this.selectList = selectList; } /**設定搜尋內容值*/ setSearchContent(searchContent) { this.searchContent = searchContent; } /**取得搜尋內容值*/ getSearchContent() { return this.searchContent; } /**取得搜尋內容元件類型*/ getSearchContentType() { return this.searchType; } // 記憶 /**記錄查詢資訊*/ setStorage() { const storeKey = location.hash ? location.hash.split('?')[0] : ''; const storeData = this.storeService.getStorage(storeKey); storeData.searchField = this.searchField; storeData.searchContent = this.searchContent; storeData.selectList = this.selectList; } } ``` .HTML ```HTML= <div class="flex-row"> <div class=" flex-col-xs-12 contentTopSearch-select02"> <select id="" class="form-control" [(ngModel)]="searchField" (change)="onSearchFieldChange()"> <option *ngFor="let searchs of searchList" [ngValue]="searchs.value" [hidden]="searchs.value == null" [disabled]="searchs.value == null"> {{searchs.name}} </option> </select> </div> <!-- 搜尋欄位 #輸入欄位 Input --> <div class=" flex-col-xs-12 contentTopSearch-content " *ngIf="searchType==ESearch.Input"> <input type="text" id="" placeholder="搜尋內容 " class="form-control input-mask-date" [(ngModel)]="searchContent"> </div> <!-- 搜尋內容 #下拉選單 Select --> <div class=" flex-col-xs-12 contentTopSearch-content" *ngIf="searchType==ESearch.Select"> <select id="" class="form-control" [(ngModel)]="searchContent" [disabled]="isSelectDisabled"> <option *ngFor="let select of selectList" [ngValue]="select.ID"> {{select.Name}}</option> <option disabled hidden [value]="''"> 全部</option> <option [value]="null" selected disabled hidden> 全部</option> </select> </div> </div> ``` ### ⛏新的作業寫法 #### #政儀寫了個怕被罵的東西 原因: 政儀收到bank/cash *** diff 這兩支幾乎一樣的新程式需求,因此想要嘗試把兩支寫成同一支,怕被罵的原因是,之後要改的人可能會看不懂所以維護時間會比較久,因為跟現在其他支的架構不一樣。 在撰寫時遇到比較特殊的問題,提出來跟大家分享。 問題: ``` 這邊要補程式碼 但我怎麼找不到QAQ ``` * input 生成的比construer慢 * 編輯後離開會彈出來了東西 使用viewChield掛進來的那支 因為沒有自己的data所以他會沒有爭測到,所以他就會錯,目前適用不太好的方式寫(),永佳(政儀說比較正確的方式)提議,可以寫在afterSelect那個function裡。 ## 事情公告 ### 📢無事情公告