ایجاد Drop Down List های آبشاری در Angular
نویسنده: وحید نصیری
تاریخ: ۱۳۹۶/۰۴/۰۹ ۱۳:۵۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class Category
{
public int CategoryId { set; get; }
public string CategoryName { set; get; }
[JsonIgnore]
public IList<Product> Products { set; get; }
}
public class Product
{
public int ProductId { set; get; }
public string ProductName { set; get; }
} namespace AngularTemplateDrivenFormsLab.Controllers
{
[Route("api/[controller]")]
public class ProductController : Controller
{
[HttpGet("[action]")]
public async Task<IActionResult> GetCategories()
{
await Task.Delay(500);
return Json(CategoriesDataSource.Items);
}
[HttpGet("[action]/{categoryId:int}")]
public async Task<IActionResult> GetProducts(int categoryId)
{
await Task.Delay(500);
var products = CategoriesDataSource.Items
.Where(category => category.CategoryId == categoryId)
.SelectMany(category => category.Products)
.ToList();
return Json(products);
}
}
} >ng g m Product -m app.module --routing
>ng g c product/product-group
>ng g cl product/product >ng g cl product/Category >ng g cl product/product-group-form
export class ProductGroupForm {
constructor(
public categoryId?: number,
public productId?: number
) { }
}
export class Product {
constructor(
public productId: number,
public productName: string
) { }
}
export class Category {
constructor(
public categoryId: number,
public categoryName: string
) { }
} >ng g s product/product-items -m product.module
import { Injectable } from "@angular/core";
import { Http, Response, Headers, RequestOptions } from "@angular/http";
import { Observable } from "rxjs/Observable";
import "rxjs/add/operator/do";
import "rxjs/add/operator/catch";
import "rxjs/add/observable/throw";
import "rxjs/add/operator/map";
import "rxjs/add/observable/of";
import { Category } from "./category";
import { Product } from "./product";
@Injectable()
export class ProductItemsService {
private baseUrl = "api/product";
constructor(private http: Http) { }
private handleError(error: Response): Observable<any> {
console.error("observable error: ", error);
return Observable.throw(error.statusText);
}
getCategories(): Observable<Category[]> {
return this.http
.get(`${this.baseUrl}/GetCategories`)
.map(response => response.json() || {})
.catch(this.handleError);
}
getProducts(categoryId: number): Observable<Product[]> {
return this.http
.get(`${this.baseUrl}/GetProducts/${categoryId}`)
.map(response => response.json() || {})
.catch(this.handleError);
}
} export class ProductGroupComponent implements OnInit {
categories: Category[] = [];
model = new ProductGroupForm();
constructor(private productItemsService: ProductItemsService) { }
ngOnInit() {
this.productItemsService.getCategories().subscribe(
data => {
this.categories = data;
},
err => console.log("get error: ", err)
);
} <div class="container">
<h3>Cascading Drop-down Lists</h3>
<form #form="ngForm" (submit)="submitForm(form)" novalidate>
<div class="form-group">
<label class="control-label">Category</label>
<span class="glyphicon glyphicon-refresh glyphicon-spin spinner" *ngIf="categories.length == 0"></span>
<select class="form-control" name="categoryCtrl" #categoryCtrl (change)="fetchProducts(categoryCtrl.value)"
[(ngModel)]="model.categoryId">
<option value="undefined">Select a Category...</option>
<option *ngFor="let category of categories" value="{{category.categoryId}}">
{{ category.categoryName }}
</option>
</select>
</div> products: Product[] = [];
isLoadingProducts = false;
fetchProducts(categoryId?: number) {
console.log(categoryId);
this.products = [];
if (categoryId === undefined || categoryId.toString() === "undefined") {
return;
}
this.isLoadingProducts = true;
this.productItemsService.getProducts(categoryId).subscribe(
data => {
this.products = data;
this.isLoadingProducts = false;
},
err => {
console.log("get error: ", err);
this.isLoadingProducts = false;
}
);
} <option value="undefined">Select a Category...</option>
public categoryId?: number
model = new ProductGroupForm();
<div class="form-group">
<label class="control-label">Product</label>
<span class="glyphicon glyphicon-refresh glyphicon-spin spinner" *ngIf="isLoadingProducts"></span>
<select class="form-control" name="productCtrl" [(ngModel)]="model.productId">
<option value="undefined">Select a Product...</option>
<option *ngFor="let product of products" value="{{product.productId}}">
{{ product.productName }}
</option>
</select>
</div> /* Spinner */
.spinner {
font-size:15px;
z-index:10
}
.glyphicon-spin {
-webkit-animation: spin 1000ms infinite linear;
animation: spin 1000ms infinite linear;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
} >npm install >ng build --watch
>dotnet restore >dotnet watch run