摘要:注意在配置完成后,需要重新啟動項目使配置生效。每一行的內容,由數據內容決定,例如有三條數據,應顯示三行數據,數據由組件自身請求獲取,所以應該有一個自身的屬性用于承載數據。注意這里將換成了,所以組件的也需要替換,否則會報錯。
使用ng2-admin搭建成熟可靠的后臺系統 -- ng2-admin(六) 完善動態表單組件
先來張本章節最終效果圖
抽離公共項,優化引入方式抽離公共項,優化引入方式
添加樣式,使我們的項目更加美觀
創建動態表格組件
配置頁面生成文件,自動化生成
重復的代碼就是失敗的代碼,所以寫代碼也是一個持續優化的過程。
我們需要用到增刪改查,上一章利用 dynamic-form.service.ts 完成了“增”的操作,現在利用同樣的文件,完成我們的查詢工作,既然用到同一個服務,所以我們需要把文件抽離,讓它更像一個公共文件。
dynamic-form/dyanmic-form.service.ts -> api/http/dynamic.service.ts
import { Observable } from "rxjs/Observable"; import "rxjs/Rx"; import { Injectable } from "@angular/core"; import { HttpClient, HttpEvent, HttpHeaders } from "@angular/common/http"; import { HttpComponentUtil } from "../../../pages/api/http/http.service"; import { HandleService } from "../../../pages/api/http/handle.service"; @Injectable() export class DynamicService { constructor( private http: HttpClient, private https: HttpComponentUtil, private handleService: HandleService ) {} public getList(url: string, params: {} = {}): Observable{ let api_url: string = this.https.getUrl(url); return this.http.get(api_url, params) .map((res: any) => ( this.handleService.handleStatus(res)).value || undefined) .catch(err => this.handleService.handleError(err)); } /** * * * @param {string} url * @param {{}} [params={}] 請求入參的 body,參數 * @returns {Observable } 返回一個可供訂閱的觀察者對象 * @memberof DynamicService * * */ public saveQuery(url: string, params: {} = {}): Observable { let api_url: string = this.https.getUrl(url); // 利用公用的 http 服務,拼接獲取url return this.http.post(api_url, params, { headers: this.https.headers }) .map((res: any) => ( this.handleService.handleStatus(res)).value || undefined) // 捕獲錯誤碼 .catch(err => this.handleService.handleError(err)); // 捕獲系統錯誤 } }
如上述代碼,同時添加一個 getList 方法,讓它有了查詢的功能,現在還需要做兩件事情,先思考一下
在 api/index.ts 導出這個服務,使其自動注入到 PagesModule 中
刪除原有文件 dynamic-form.service.ts 及相關信息
把時間都用在 如何找尋相對路徑 這個問題上,是非常浪費時間的一件事情
在此之前,項目的引入方式都是相對路徑,我們現在來修改配置,然后使路徑引入變成相對路徑,這里需要修改
tsconfig.json
... "paths": { "@angular/*": ["../node_modules/@angular/*"], "@components/*": ["../src/app/theme/components/*"], "@api/*": ["../src/app/pages/api/*"] } ...
其中有一個選項,在之前升級的過程中已經添加,根據第一項,可以推斷出新增的兩個選項的用途,在下面的教程中會統一使用該方式引入,在后面配置問題將不再重復,需要讀者自行添加。
注意:在配置完成后,需要重新啟動項目使配置生效。
好看的網頁離不開優秀的設計,我們需要盡我們所能,優化頁面的樣式。
在此之前,項目還沒有重置過樣式,所以我們需要去優化一下我們的樣式
npm i reset.css -D
pages.component.ts
... import "style-loader!reset.css"; import "style-loader!sweetalert2/dist/sweetalert2.min.css"; import "style-loader!@api/universal/style.scss"; ...
@api/universal/style.scss
.default-style { h1 { font-size: 30px; font-weight: bold; margin-bottom: 25px; } }
注意:使用 import 引入的樣式將會無差別影響到所有的樣式,所以除了公用樣式,其他都使用 styleUrls 的方式引入
創建動態表格組件在修改代碼的時候,大概 60%-70% 的時間都在讀之前的代碼。
我們需要創建一個動態表格組件,對應的我們應該先創建一些聲明文件,作為起步,同時也可以讓自己知道自己在創造什么,項目結構如下圖。
和動態表單類似,我們先創建
dynamic-table-base/tableItem-base.ts
export class TableBase { controlType: string; // 類型 title: string; // 值,類型可選 key: string; // 字段名 order: number; // 排序 constructor( options: { controlType?: string; title?: string; key?: string; order?: number; } = {} ) { // 設置各個值的默認值 this.controlType = options.controlType || ""; this.title = options.title || ""; this.key = options.key || ""; this.order = options.order || 0; } }
dynamic-table-base/tableItem-text.ts
import { TableBase } from "./tableItem-base"; export class TextTable extends TableBase { controlType = "text"; constructor(options: {} = {}) { super(options); } }
dynamic-table/table-base.ts
export interface TableConfig { url: string; params?: TableParams; } // 請求接口的一些參數 interface TableParams { pageSize?: number; pageNumber?: number; }
準備工作到此結束,現在準備來創建我們的動態表格組件
開發組件時,需要考慮可擴展性
我們的表格組件應該有展示功能,規定顯示幾列,每一列的內容應該由頁面傳入,數據來源的 url 應該也由頁面配置傳入,所以我們會有兩個 Input 屬性。
每一行的內容,由數據內容決定,例如有三條數據,應顯示三行數據,數據由組件自身請求獲取,所以應該有一個自身的屬性用于承載數據。
export class DynamicTableComponent implements OnInit{ @Input() config: TableConfig; @Input() tableControls: TableBase[]; public tableDatas: any[]; }
在加載組件時,應該自動請求數據,組件的最終效果如下
dynamic-table.component.ts
import { Component, Input, OnInit } from "@angular/core"; import { TableConfig } from "./table-base"; import { TableBase } from "./dynamic-table-base/tableItem-base"; import { DynamicService } from "@api/http/dynamic.service"; @Component({ selector: "dynamic-table", templateUrl: "./dynamic-table.component.html", styleUrls: ["./dynamic-table.component.scss"] }) export class DynamicTableComponent implements OnInit{ @Input() config: TableConfig; @Input() tableControls: TableBase[]; public tableDatas: any[]; constructor(private service: DynamicService) {} private getTableDatas(): void { this.service.getList(this.config.url, this.config.params) .subscribe((res: any[]) => { console.log(res); if (res.length > 0) { this.tableDatas = res; } }) } ngOnInit(): void { this.getTableDatas(); } }
dynamic-table.component.html
{{tableControl.title}}
- {{tableData[tableControl["key"]]}}
- {{tableData | json}}
dynamic-table.component.scss
.table thead tr th { background: rgba(0,0,0,.3); color: #fff; font-size: 16px; border-top: none; } .table tbody > :first-child td { border-top: none; }
這樣動態表格組件的基本樣式就完成,最后別忘了在 nga.module.ts 中注冊該組件。
注意:這里將 service 換成了 DynamicService, 所以 form 組件的 service也需要替換,否則會報錯。
配置頁面生成文件,自動化生成組件已經構建完成,頁面的配置和 form 組件的使用方法類似,這里直接貼代碼
user-list.component.ts
import { Component } from "@angular/core"; import { UserListService } from "./user-list.service"; import { TableBase } from "@components/dynamic-table/dynamic-table-base"; import { TableConfig } from "@components/dynamic-table/table-base"; @Component({ selector: "ngt-user-list", templateUrl: "./user-list.component.html", providers: [ UserListService ] }) export class UserListComponent { public userTableControls: TableBase[]; public userTableConfig: TableConfig = { url: "user" }; constructor(private service: UserListService) { this.userTableControls = this.service.getTableControls(); } }
user-list.component.html
用戶列表組件
user-list/user-list.service.ts
import { Injectable } from "@angular/core"; import { TableBase, TextTable } from "@components/dynamic-table/dynamic-table-base"; @Injectable() export class UserListService { getTableControls() { let tableControls: TableBase[] = [ new TextTable({ key: "id", title: "ID", order: 0 }), new TextTable({ key: "firstName", title: "名稱", order: 1 }), new TextTable({ key: "emailAddress", title: "Email", order: 2 }), new TextTable({ key: "brave", title: "Brave", order: 3 }) ]; return tableControls.sort((a, b) => a.order - b.order); } }
大功告成,現在可以打開瀏覽器,嘗試先進入新增頁面,新增一個用戶,在成功返回后,會在表格頁面查詢到自己新增的數據,這樣就完成了簡單的數據展示。
現在表格還有幾個優化的點
數據過多時,需要分頁
缺少搜索功能
缺少刪除功能
在后續文章,會陸續添加這些功能!
(此章代碼在ng2-admin 的 dynamic-table 分支上,可以pull 下來,方便讀者練習)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/90667.html
摘要:使用搭建成熟可靠的后臺系統三完善動態表單添加樣式。下一章會講解,一個集成的服務,來完成我們的提交,在將來的篇章里會在我們的組件中加入使其變得更加靈活。 使用ng2-admin搭建成熟可靠的后臺系統 -- ng2-admin(三) 完善動態表單 添加樣式。 抽離組件。 添加組件樣式 上一篇文章創建了兩個,組件,現在使用bootstrap來給他們添加一些樣式 首先需要一個公用的 s...
摘要:使用搭建成熟可靠的后臺系統四完善動態表單組件添加正則驗證添加錯誤提示添加正則驗證先來設置一些錯誤提示,以及添加正則驗證上一章可能遺留了部分路徑錯誤,可以自行調整郵箱格式不正確請選擇這里是提供的一些正則 使用ng2-admin搭建成熟可靠的后臺系統 -- ng2-admin(四) 完善動態表單組件 添加正則驗證 添加錯誤提示 添加正則驗證 先來設置一些錯誤提示,以及添加正則驗證(...
摘要:使用搭建成熟可靠的后臺系統二構建動態表單構建一個動態表單,動態生成控件,驗證規則?,F在來創建它的子組件從上面的組件可以看出,未來需要添加組件時,只需要添加一種類型,可以用決定顯示哪種類型的問題。 使用ng2-admin搭建成熟可靠的后臺系統 -- ng2-admin(二) 1.構建動態表單 構建一個動態表單,動態生成控件,驗證規則。 創建一個input組件,一個select組件 將...
摘要:創建一個工具類,負責提供以及完成拼接參數的工作。根據我們的配置,來創建這個文件。因為是表單提交,所以我們新建一個服務,由它來完成表單提交的最后一步。 使用ng2-admin搭建成熟可靠的后臺系統 -- ng2-admin(五) 完善動態表單組件 升級Angular 4.1 -> 4.3 添加 json-server 模擬數據 創建自己的 http 完成一次表單提交 升級Angu...
摘要:云函數是萬金油為實現用戶游戲數據存儲和每日任務分發,我們最先用了存儲服務和云引擎。不過我們并沒有用提供的來直接調用存儲服務,而是選擇用調用云引擎里面的云函數,然后通過云函數調用存儲服務來實現相應的邏輯。 【 玩轉 LeanCloud 】開發者投稿分享: 作者:趙天澤 作為一個通過 LeanCloud 入門后端開發的小白,一年多的開發歷程讓我收獲滿滿。多個項目也在 LeanCloud 可...
閱讀 1558·2021-11-25 09:43
閱讀 2344·2019-08-30 15:55
閱讀 1469·2019-08-30 13:08
閱讀 2675·2019-08-29 10:59
閱讀 821·2019-08-29 10:54
閱讀 1590·2019-08-26 18:26
閱讀 2550·2019-08-26 13:44
閱讀 2658·2019-08-23 18:36