#javascript #html #angularjs
#javascript #HTML #angularjs
Вопрос:
Я пытался разобраться в этом, но, похоже, у меня ничего не получается…
Я пытаюсь отфильтровать перечисленные проекты на основе выбранного / активного элемента из меню.
Вот код:
var webApp = angular.module("webApp", []);
webApp.controller("webController", function($scope) {
$scope.projects = [{
image: "images/farmly.png",
title: "farmly",
categories: ["UX/UI Design", "Branding"],
year: "2018",
},
{
image: "images/TRND.png",
title: "TRND Global",
categories: ["Branding", "Marketing", "Social Media"],
year: "2019",
},
{
image: "images/AestheticBedrooms.jpg",
title: "Aesthetic Bedrooms",
categories: [
"Web Development",
"UX/UI Design",
"Branding",
"Social Media",
],
year: "2020",
},
];
});
<div id="menuOptions">
<a class="workMenuOptions active">All</a>
<a class="workMenuOptions">Branding</a>
<a class="workMenuOptions">Marketing</a>
<a class="workMenuOptions">Social Media</a>
<a class="workMenuOptions">UX/UI Design</a>
<a class="workMenuOptions">Web Development</a>
</div>
<div class="presentedWork">
<div class="project" ng-repeat="project in projects | limitTo: 4 | filter: {categories: 'Branding' } | orderBy: 'year';">
<div class="projectContent">
<img src="{{project.image}}">
<h3>{{project.title}}</h3>
<p>
<span class="categorySpan" ng-repeat="category in project.categories | orderBy: category">
{{category}}<span class="categorySpan" ng-if="!$last">, </span>
</span> |
<span>{{project.year}}</span>
</p>
</div>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.9/angular.min.js"></script>
Как я могу отфильтровать ng-repeat
, чтобы показывать проекты только на основе выбранного элемента меню? В настоящее время существует ручной фильтр, который фильтрует по «брендингу».
Заранее спасибо!
Комментарии:
1. Я бы максимально отделил логику от пользовательского интерфейса. Рассмотрите возможность создания другого массива filteredItems для ng-repeat поверх этого. Затем создайте логику, которая заполняет filteredItems на основе того, что вы выбрали в меню
Ответ №1:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.firstName = "John";
$scope.lastName = "Doe";
$scope.filterName = '';
$scope.projects = [{
image: "https://picsum.photos/200/300",
title: "farmly",
categories: ["UX/UI Design", "Branding"],
year: "2018",
},
{
image: "https://picsum.photos/200/300",
title: "TRND Global",
categories: ["Branding", "Marketing", "Social Media"],
year: "2019",
},
{
image: "https://picsum.photos/200/300",
title: "Aesthetic Bedrooms",
categories: [
"Web Development",
"UX/UI Design",
"Branding",
"Social Media",
],
year: "2020",
},
];
});
app.filter('myFilter', function() {
return function(x, y) {
if (y.filterName === '') return x;
else {
return x.filter(function(item) {
return item.categories.includes(y.filterName)
})
}
}
})
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<div>
<button class="workMenuOptions active" ng-click="filterName=''">All</button>
<button ng-click="filterName='Branding'" class="workMenuOptions">Branding</button>
<button ng-click="filterName='Marketing'" class="workMenuOptions">Marketing</button>
<button ng-click="filterName='Social Media'" class="workMenuOptions">Social Media</button>
<button ng-click="filterName='UX/UI Design'" class="workMenuOptions">UX/UI Design</button>
<button ng-click="filterName='Web Development'" lass="workMenuOptions">Web Development</button>
</div>
<br/>
<div class="presentedWork">
<div class="project" ng-repeat="project in projects | limitTo: 4 | myFilter : {filterName } | orderBy: 'year';">
<div class="projectContent">
<img src="{{project.image}}">
<h3>{{project.title}}</h3>
<p>
<span class="categorySpan" ng-repeat="category in project.categories | orderBy: category">
{{category}}<span class="categorySpan" ng-if="!$last">, </span>
</span> |
<span>{{project.year}}</span>
</p>
</div>
</div>
</div>
</div>
</body>
</html>
Комментарии:
1. Большое вам спасибо! Именно то, что я хотел. Очень прямолинейно и эффективно — хорошая работа.