## Primeng
### 建立專案
```
ng new 專案名稱
```
選擇第二個SCSS

開啟專案(在專案資料夾中)
```
ng serve -o
```

安裝Angular Cli
```
npm install -g @angular/cli
```
安裝Angular cdk
```
npm install @angular/cdk
```
查看安裝的Cli版本
```
ng version | ng v
```
新增primeflex > [ https://www.primefaces.org/primeflex/setup](https://)
```
npm install primeflex --save
```
```
<!-- 貼在index.html -->
<!-- CSS only -->
<link rel="stylesheet" href="https://unpkg.com/primeflex@^3/primeflex.css">
```
匯入BrowserAnimationsModule到app.module.ts
```
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
//貼在imports裡面
BrowserAnimationsModule,
```
安裝Primeng > [https://primeng.org/installation](https://)
```
npm install primeng --save
npm install primeicons --save
```
匯入primeng樣式(如下圖,記得加",")
貼在angular.json的styles裡面
```
"node_modules/primeicons/primeicons.css",
"node_modules/primeng/resources/themes/saga-blue/theme.css",
"node_modules/primeng/resources/primeng.min.css"
```

### 共享模組
1. 在app資料夾下新增shared module
(右鍵app資料夾->選擇Generate a module 或
右鍵app資料夾->選擇Generate another schematic->module)
2. 在shared資料夾下新增primeng module
新增完成後如下

3. import primeng
並在primeng資料夾中新增primeng module
```
import { InputTextModule } from 'primeng/inputtext';
import { CheckboxModule } from 'primeng/checkbox';
import { MenubarModule } from 'primeng/menubar';
import { TableModule } from 'primeng/table';
import { ButtonModule } from 'primeng/button';
import { FieldsetModule } from 'primeng/fieldset';
import { CardModule } from 'primeng/card';
import { InputTextareaModule } from 'primeng/inputtextarea';
import { TabViewModule } from 'primeng/tabview';
import { DialogModule } from 'primeng/dialog';
import { InputNumberModule } from 'primeng/inputnumber';
import { TriStateCheckboxModule } from 'primeng/tristatecheckbox';
import { DropdownModule } from 'primeng/dropdown';
import { ListboxModule } from 'primeng/listbox';
import { TagModule } from 'primeng/tag';
import { ProgressBarModule } from 'primeng/progressbar';
import { SliderModule } from 'primeng/slider';
import { MultiSelectModule } from 'primeng/multiselect';
import { SidebarModule } from 'primeng/sidebar';
import { MenuModule } from 'primeng/menu';
import { PanelMenuModule } from 'primeng/panelmenu';
import { PickListModule } from 'primeng/picklist';
import { AutoCompleteModule } from 'primeng/autocomplete';
import { DividerModule } from 'primeng/divider';
import { InputSwitchModule } from 'primeng/inputswitch';
import { CalendarModule } from 'primeng/calendar';
import { ToastModule } from 'primeng/toast';
import { BlockUIModule } from 'primeng/blockui';
import { ProgressSpinnerModule } from 'primeng/progressspinner';
import { ConfirmDialogModule } from 'primeng/confirmdialog';
import { PaginatorModule } from 'primeng/paginator';
import { FileUploadModule } from 'primeng/fileupload';
import { SelectButtonModule } from 'primeng/selectbutton';
import { PasswordModule } from 'primeng/password';
import { ImageModule } from 'primeng/image';
import { TabMenuModule } from 'primeng/tabmenu';
import { TooltipModule } from 'primeng/tooltip';
import { ChipsModule } from 'primeng/chips';
//貼在import下面
exports: [
InputTextModule,
CheckboxModule,
MenubarModule,
TableModule,
ButtonModule,
FieldsetModule,
CardModule,
InputTextareaModule,
TabViewModule,
DialogModule,
InputNumberModule,
TriStateCheckboxModule,
DropdownModule,
ListboxModule,
TagModule,
ProgressBarModule,
SliderModule,
MultiSelectModule,
SidebarModule,
MenuModule,
PanelMenuModule,
PickListModule,
AutoCompleteModule,
DividerModule,
InputSwitchModule,
CalendarModule,
ToastModule,
BlockUIModule,
ProgressSpinnerModule,
ConfirmDialogModule,
PaginatorModule,
FileUploadModule,
SelectButtonModule,
PasswordModule,
ImageModule,
TabMenuModule,
TooltipModule,
ChipsModule
]
```
exports貼在import下面(如下圖,記得加",")

4. 到shared.module.ts 匯入 primeng
```
import { PrimengModule } from './primeng/primeng.module';
//貼在import下面
exports: [
PrimengModule,
]
```
5. 到app.modules.ts 匯入共享模組 (shared module)
```
import { SharedModule } from './shared/shared.module';
//貼在import裡面
imports: [
SharedModule,
]
```
### 建立 toolbar & sidebar
1. 建立toolbar component
2. toolbar & sidebar(toolbar.component.html)
```
<p-toolbar>
<div class="p-toolbar-group-left">
<button pButton pRipple type="button" icon="pi pi-bars" class="p-button-rounded p-button-text p-button-plain"
(click)="showSidebar = true"></button>
<a href="http://localhost:4200/">
<span>Primeng Class</span>
</a>
</div>
<div class="p-toolbar-group-right">
<!-- 右側按鈕 -->
</div>
</p-toolbar>
<p-sidebar [(visible)]="showSidebar" [baseZIndex]="10000" [showCloseIcon]="false" (onHide)="showSidebar = false">
<h3>選單</h3>
</p-sidebar>
```
3. 樣式設定 ( toolbar.component.scss )
```
@import 'src/app/app.component.scss';
a {
text-decoration:none;
span {
color: hsl(0, 0%, 0%);
font-size: x-large;
}
}
```
( toolbar.component.ts )
```
showSidebar = false;
```
( app.component.html ) 全部刪掉改成以下
```
<app-toolbar></app-toolbar><!--顯示導覽列於每個頁面-->
<router-outlet></router-outlet><!--顯示該路徑頁面內容-->
```
### 新增一個component
右鍵->generate a component->名稱(自定義表格我用table)
* 檢查app.module.ts有無自動import component
* 記得要在routing import table component,如下圖所示

### 建立api
[https://medium.com/itsems-frontend/api-是什麼-restful-api-又是什麼-a001a85ab638](https://)
* 建立api servic:新增api資料夾->右鍵->generate a service->名稱(api)
* 匯入HTTP模組、定義HttpClient
```
import {HttpClient} from '@angular/common/http';
import {Observable} from "rxjs";
constructor(private http: HttpClient) { }
```
* 匯入HttpClient模組
```
// shared.module.ts
import { HttpClientModule } from '@angular/common/http';
```
* 定義 API 的固定網址
```
private BaseUrl: string = 'http://localhost:8080/authority/v1.0';
```
* 定義GET API
```
//get
//加上回傳值page並設定limit為20
getAllRequest(page: number): Observable<any> {
const url = this.BaseUrl + '/table' + '?page=' + page + '&limit=20';
return this.http.get(url);
}
```
* GET
```
// 匯入api service
import { ApiService } from "../api/api.service";
// 建構類別
constructor(private HttpApi: ApiService) {}
// 宣告儲存api資料之陣列
apiData!: ApiService[];
// 取得api service定義API
getAll() {
this.HttpApi.getAllRequest().subscribe(request => {
this.apiData = request;
console.log(this.apiData);
});
}
```
### 懶加載(這個我一直報錯
```
import { LazyLoadEvent } from 'primeng/api';
//懶加載
loadPostsLazy(event: LazyLoadEvent) {
const page = (event.first! / event.rows!) + 1;
this.HttpApi.getAllRequest(page).subscribe(request => {
this.apiData = request;
console.log(this.apiData);
});
}
```
### 學長姐給的參考資料
* [發送會議並且紀錄使用API](https://hackmd.io/@Rdong/SkGcUgfRi#%E5%89%8D%E7%AB%AF%E7%95%AB%E9%9D%A2)
* [淺談Angular元件生命週期](https://hackmd.io/@Heidi-Liu/angular-lifecycle)
* [Angular基礎|從Todo List認識四種資料綁定](https://hackmd.io/@Heidi-Liu/angular-data-binding)
* [【後轉前要多久】各種ng指示(ngClass、ngIf、ngFor...)](https://ithelp.ithome.com.tw/articles/10281608)
* [keyup用法](https://ithelp.ithome.com.tw/articles/10207190)
### 操作小技巧
html基本語法:[https://www.w3schools.com/html/default.asp](https://)
css基本語法:[ https://www.w3schools.com/css/default.asp](https://)
boostrap:[https://getbootstrap.com/docs/5.3/layout/columns/](https://)
* [后端分页+前端分页显示(Angular+Primeng+SpringBoot)](https://blog.csdn.net/could98/article/details/112779676)
打`div.class`自動生成以下
```
<div class="class"></div>
```
### 報錯處理
1. p-toorbar

* 解決
> 在app.module.ts加上`CUSTOM_ELEMENTS_SCHEMA`,如下
```
import { NgModule,CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
schemas:[CUSTOM_ELEMENTS_SCHEMA],
```

2. $event

* 解決
:::warning
煩欸,我解決不了,超生氣! :zap:
:::