Имеется страница, контент которой отображается с помощью Knockout. Поставщик содержимого - веб-сервис. При первой загрузке все отображается корректно. Проблемы начинаются при переходе по категориям: при нажатии на категорию каждый товар отображается в нескольких копиях.
HTML-код:
<div class="row" id="productContainer" data-bind="foreach: products">
<div class="col-6 col-sm-6 col-lg-4">
<h2 data-bind="text: name"></h2>
<p data-bind="text: description"></p>
<div style="float: left; margin-right: 20px">
<img width="75" height="75" class="img-thumbnail" data-bind="attr: {src: imagePath }" />
</div>
<h2 data-bind="text: price"></h2>
<form action="/Cart/AddToCart" method="post">
<input data-val="true" data-val-number="The field ProductID must be a number" data-val-required="The ProductID field is required." id="ProductID" name="ProductID" type="hidden" data-bind="attr: {value: productID}" />
<input id="returnUrl" name="returnUrl" type="hidden" value="/" />
<input type="submit" class="btn btn-success" value="+ Add to cart" />
</form>
</div>
</div>
ViewModel KO:
function Product(id, name, description, price, category) {
var self = this;
self.productID = ko.observable(id);
self.name = ko.observable(name);
self.description = ko.observable(description);
self.price = ko.computed(function () {
return price ? '$' + price : 'None';
});
self.category = ko.observable(category);
self.imagePath = ko.observable('/Product/GetImage?ProductID=' + id);
};
function ProductsViewModel(category) {
var self = this;
self.products = ko.observableArray([]);
$.getJSON("api/productservice/" + category, function (allData) {
var MappedProducts = $.map(allData, function (item) { return new Product(item.ProductID, item.Name, item.Description, item.Price, item.category) });
self.products(MappedProducts);
});
}
Код, содержащий обработчик события нажатия на ссылку-категорию:
$(document).ready(function () {
$('a').click(
function (e) {
if (e.target.id == "categoryLink") {
//$('#productContainer').empty();
var category = $(e.target).text();
ko.applyBindings(new ProductsViewModel(category));
};
});
ko.applyBindings(new ProductsViewModel(""));
});
Первая загрузка:
Перешел по категории:
Есть идеи?