title: Angular UI:Clarity Design System
date: 2017-09-08 10:00
categories: Training
keywords:
因為多個一個新案子,所以就順便試試 VMware 所開發的 Clarity Design System
不知道怎麼建立的可以參考 建立 Angular 專案。
目前環境:
Node.js:8.4.0
Angular CLI:1.4.0
Angular:4.4.0-RC.0
安裝教學可參閱 https://vmware.github.io/clarity/get-started。
安裝指令如下:npm install clarity-icons --save
官方指南是在網頁加入連結:<link rel="stylesheet" href="path/to/node_modules/clarity-icons/clarity-icons.min.css">
<script src="path/to/node_modules/clarity-icons/clarity-icons.min.js"></script>
但是筆者是將它加到 .angular-cli.json
內的 styles
以及 scripts
屬性。"../node_modules/clarity-icons/clarity-icons.min.css"
"../node_modules/clarity-icons/clarity-icons.min.js"
js 檔或是 css 檔連結來自
node_modules
時,筆者習慣都是加到.angular-cli.json
。
安裝指令如下:npm install @webcomponents/custom-elements@1.0.0 --save
官方指南是在網頁加入連結:<script src="path/to/node_modules/@webcomponents/custom-elements/custom-elements.min.js"></script>
但是筆者仍然是加到 .angular-cli.json
內的 scripts
屬性。"../node_modules/@webcomponents/custom-elements/custom-elements.min.js"
安裝指令如下:npm install clarity-ui --save
官方指南提供網頁連結的方法:<link rel="stylesheet" href="path/to/node_modules/clarity-ui/clarity-ui.min.css">
以及加入 .angular-cli.json
方法,加到 styles
屬性:"../node_modules/clarity-ui/clarity-ui.min.css"
筆者選擇後者。
安裝指令如下:npm install clarity-angular --save
然後在模組 src\app\app.module.ts
加入參考。
{% codeblock app.module.ts lang:ts %}
import { BrowserModule } from ‘@angular/platform-browser’;
import { NgModule } from ‘@angular/core’;
import { ClarityModule } from ‘clarity-angular’;
import { AppRoutingModule } from ‘./app-routing.module’;
import { AppComponent } from ‘./app.component’;
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ClarityModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
{% endcodeblock %}
新增一個模組-HomeModule,指令如下:ng g m home --routing
將 HomeModule 加入到 src\app\app.module.ts
內。
{% codeblock app.module.ts lang:ts %}
import { BrowserModule } from ‘@angular/platform-browser’;
import { NgModule } from ‘@angular/core’;
import { ClarityModule } from ‘clarity-angular’;
import { AppRoutingModule } from ‘./app-routing.module’;
import { AppComponent } from ‘./app.component’;
import { HomeModule } from ‘./home/home.module’;
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ClarityModule.forRoot(),
HomeModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
{% endcodeblock %}
在 home 資料夾下新增一個元件-IndexComponent,指令如下:ng g c home\index
IndexComponent 會自動被註冊到 HomeModule。
開啟src\app\home\home-routing.module.ts
,加入路由規則。
{% codeblock home-routing.module.ts lang:ts %}
import { NgModule } from ‘@angular/core’;
import { Routes, RouterModule } from ‘@angular/router’;
import { IndexComponent } from ‘./index/index.component’;
const routes: Routes = [
{ path: ‘’, component: IndexComponent, children: [] }
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class HomeRoutingModule { }
{% endcodeblock %}
查看網站可以發現官方已經提供一個版面-Application Layout。
將範例程式碼複製到 src\app\home\index\index.component.html
,並在每個 div
區段內加入文字註解。
{% codeblock index.component.html lang:html %}
{% endcodeblock %}
透過 ng serve
啟動,並開啟瀏覽器觀看結果。
因為今天早上看到 Angular CLI 的 1.4.0 版已經 release 所以就直接更新,開發過程卻因此發生一些問題:
- 在
.angular-cli.json
關閉 spec,但是單元測試檔仍然會被建立。style
設成scss
,但是建立元件時樣式檔卻是.css
。所以如果不能忍受 bug 的人,建議晚幾個禮拜確定沒有災情發生後再更新。
建立 Header元件 指令如下:ng g c home\header
複製官方 Header 範例:
{% codeblock header.component.html lang:html %}
{% endcodeblock %}
在專案內預設元件的 selector
屬性都是 app-
開頭,如果整個專案元件很多時,會變得有點多餘。
修改名稱時會發現必須加入關閉 tslint 的 component-selector
檢查機制才能修改。// tslint:disable-next-line:component-selector
但是如果每個元件都要加上註解又會很麻煩,所以我們直接開啟專案下 tslint 的設定檔-tslint.json
,用關鍵字 component-selector
搜尋,可以發現如下的設定:
比較正規的做法應該是將想的要前綴詞加進去,但是筆者比較偷懶,將最前面的布林參數由 true
改成 false
,這樣就會忽略檢查。
可以看到拿掉 header.component.ts
拿掉註解也不會出現錯誤。
開啟 src\app\home\index\index.component.html
,插入 HeaderComponent。
{% codeblock index.component.html lang:html %}
{% endcodeblock %}
開啟瀏覽器檢視結果。
修改 src\app\home\index\index.component.ts
,將 selector
屬性設為 'home'
。
selector
命名如果分類的好,後續其他專案可以整個模組資料夾複製過去沿用,因此應避免名稱容易重複的命名規則。
如同 Header 步驟,我們先建立一個 SidenavComponent,並將 selector
設定為 'home-sidenav'
。ng g c home\sidenav
再將官方 Sidenav 範例 複製至 src\app\home\sidenav\sidenav.component.html
。
{% codeblock sidenav.component.html lang:html %}
{% endcodeblock %}
開啟 src\app\home\index\index.component.html
,插入 SidenavComponent。
{% codeblock index.component.html lang:html %}
{% endcodeblock %}
開啟瀏覽器檢視結果。
再來筆者選用官方元件-Tabs,來取代 Subnav 區塊,方法與之前雷同。ng g c home\subnav
編輯 src\app\home\subnav\subnav.component.html
。
{% codeblock subnav.component.html lang:html %}
{% endcodeblock %}
編輯 src\app\home\index\index.component.html
。
{% codeblock index.component.html lang:html %}
{% endcodeblock %}
開啟瀏覽器檢視結果。
切換到 Login Page,沒看錯, Clarity Design System 直接提供一個 login page,建立一個 LoginComponent 來對應。ng g c login
編輯 src\app\login\login.component.html
。
{% codeblock login.component.html lang:html %}
{% endcodeblock %}
編輯 src\app\app-routing.module.ts
,插入 login
的路由規則。
{% codeblock app-routing.module.ts lang:ts %}
import { NgModule } from ‘@angular/core’;
import { Routes, RouterModule } from ‘@angular/router’;
import { LoginComponent } from ‘./login/login.component’;
const routes: Routes = [
{ path: ‘login’, component: LoginComponent}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
{% endcodeblock %}
執行專案,瀏覽 http://localhost:4200/login。
整個網站基本框架就在不斷複製貼上中完成,對於網頁開發新手來說是不是簡單很多?
{% img /images/download.png 36 %}genesis_2017-09-08.zip