@DarCKoder

Как разорвать эту связь (Angular 2)?

Добрый вечер.
Итак, что имеем:
(В самом конце выписаны все скрипты из скринов)
Есть 2 Компонента - один, используется в другом:
Первый компонент - homeWork.component(html/ts):
91c1838e9bed495f84995f47ab1b48b9.png

И второй компонент - myTable.component(html/ts):
4e32a47190b5422daaa761a3ce1c9ac8.png

И файл products.ts подключаемый в компонент myTable.component.ts
f49bfb99b9bb4f76a129e77524fd8918.png

Проблема в том, что при вызове нового компонента myTable.component посредством тега my-table в компоненте homeWork.component.html, все три ( в данном случае вызвал 3 тега my-table с разными параметрами) шаблона чувствуют нажатие на категории в шаблонах друг друга, сейчас поясню:

Вот начальный интерфейс:
f74d39a76ce04e448e41432cc19967f8.png

при нажатии на любую из категорий в любом из шаблонов, реагируют все три шаблона:
03877ea42a0e4efb9ae0db93c9768eef.png

Вопрос в следующем, как можно разорвать связь между тремя шаблонами, так что бы каждый из них жил своей жизнью?

Все скрипты:
homeWork.component.ts
import { Component } from "@angular/core";

@Component({
	moduleId: module.id,
	selector: "first-homework",
	templateUrl: "homeWork.component.html"
})
export class HomeworkComponent {

}


homeWork.component.html
<h2>Exercise 1</h2>
<hr>
<h1>Table</h1>
<my-table [rows]="10"></my-table>
<my-table [rows]="7"></my-table>
<my-table [rows]="8"></my-table>


myTable.component.ts
import { Component } from "@angular/core";
import { Products } from "./products";
 
@Component({
	moduleId: module.id,
	selector: "my-table",
	templateUrl: "myTable.component.html",
	styleUrls: ["myTable.component.css"],
	inputs: ["rows"]
})
export class MyTableComponent {
	products = new Products;
	rows: number;
	info = [];
	categories = {
		category1: [],
		category2: [],
		category3: []
	};
	newProductName: string = "Default Name";
	newProductPrice: number = 0;


	getCategory(product) {
		var result;
		if (product.price <= 300) {
			result = 'Category 1';
			this.categories.category1.push(product);
		} else if (product.price <= 700 && product.price > 300) {
			result = 'Category 2';
			this.categories.category2.push(product);
		} else if(product.price > 700) { 
			result = 'Category 3';
			this.categories.category3.push(product);
		}
		return result;
	}

	sort(cat) {
		let that = this;
		switch(cat) {
			case '*':
				sorting(this.info);
				break;
			case 1:
				sorting(this.categories.category1);
				break;
			case 2:
				sorting(this.categories.category2);
				break;
			case 3:
				sorting(this.categories.category3);
				break;
		}

		function sorting(category) {
			that.info.map(function(product) {
				product.hiddenByCategory = true;
			});
			category.map(function(product) {
				product.hiddenByCategory = false;
			});
		}
	}

	addProduct() {
		let product = {
			id: this.info.length + 1,
			name: this.newProductName,
			price: this.newProductPrice
		};

		this.info.push(product);
	}

	ngOnInit() {
		this.info = this.products.products.slice(0, this.rows);
	}
}

myTable.component.html
<div class="addProduct">
	<input type="text" [(ngModel)]="newProductName">
	<input type="text" [(ngModel)]="newProductPrice">
	<button (click)="addProduct()">Add new product</button>

</div>
<ul class="sort">
	<li (click)="sort('*')">All</li>
	<li (click)="sort(1)">Category 1</li>
	<li (click)="sort(2)">Category 2</li>
	<li (click)="sort(3)">Category 3</li>
</ul>
<table>
	<tr>
		<th>Id</th>
		<th>Name</th>
		<th>Price</th>
		<th>Category</th>
	</tr>
	<ng-container *ngFor="let product of info">
		<tr	
			*ngIf="!product.hidden && !product.hiddenByCategory" 
			[style.color] = "(product.price >= 600) ? 'red' : 'none'"
		>
			<td>{{product.id}}</td>
			<td>{{product.name}}</td>
			<td>{{product.price}}</td>

			<td>{{ getCategory(product) }}</td>
			<td><button (click)="product.hidden = true">hide</button></td>
		</tr>
	</ng-container>
</table>
<hr><hr>


products.ts

let products = [
	{ id: 1, name: "product 1 ", price: 100 },
	{ id: 2, name: "product 2 ", price: 200 },
	{ id: 3, name: "product 3 ", price: 300 },
	{ id: 4, name: "product 4 ", price: 400 },
	{ id: 5, name: "product 5 ", price: 500 },
	{ id: 6, name: "product 6 ", price: 600 },
	{ id: 7, name: "product 7 ", price: 700 },
	{ id: 8, name: "product 8 ", price: 800 },
	{ id: 9, name: "product 9 ", price: 900 },
	{ id: 10, name: "product 10", price: 1000 }
]; 

export class Products {
	products = products;
	
	addProduct(newProduct) {
		this.products.push(newProduct);
	}
}
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы