Я не понимаю, почему ng-click над циклом может фильтровать данные, а ng-click внутри первого цикла - нет.
Я полностью не знаю, что не так
var booksAPP = angular.module('booksAPP', []);
booksAPP.controller('booksCTRL', function($scope) {
$scope.bookData = {
books: [
{name: "JS learn", tag: "js", category: "javascript"},
{name: "PHP learn", tag: "php", category: "php"},
{name: "JS Ninja", tag: "js", category: "javascript"},
{name: "HTML Ninja", tag: "html", category: "HTML"}
]
};
$scope.bookTAG = {
tags: [
{name: 'js'},
{name: 'php'},
{name: '.NET'},
{name: 'HTML'}
]
}
})
<span ng-click="clickTAG = {'tag':'js'}">THIS WORKS NICE BEACUSE THEY BEFORE REPEAT</span>
<ul>
<li><strong>TAGS:</strong></li>
<li ng-repeat="tag in bookTAG.tags" ng-click="clickTAG = {'tag': tag.name}">{{tag.name}}</li>
</ul>
<ul>
<li><strong>BOOKS:</strong></li>
<li ng-repeat="book in bookData.books | filter:clickTAG">{{book.name}}</li>
</ul>
Каждый элемент, созданный ng-repeat, имеет свою собственную область, содержащую дополнительные поля $index
, $first
и т.д., А также book
переменную. Итак, если внутри ng-repeat вы делаете
ng-click="clickTAG = {'tag': tag.name}"
вы устанавливаете поле clickTAG
области повторяющихся элементов ng, вместо того, чтобы устанавливать его в область контроллера.
Чтобы предотвратить это, и одновременно очистите очиститель кода, добавьте следующую функцию в область контроллера:
$scope.setClickTag = function(name) {
$scope.clickTAG = {'tag': name};
}
и использовать
ng-click="setClickTag(tag.name)"
Поскольку ng-repeat создает свою собственную область действия и из-за прототипического наследования $scope
при написании clickTAG =...
он создает новую переменную в области ng-repeat
. Вы можете использовать $parent
для ссылки на родительский охват ng-repeat
:
<ul>
<li><strong>TAGS:</strong></li>
<li ng-repeat="tag in bookTAG.tags" ng-click="$parent.clickTAG = {'tag': tag.name}">{{tag.name}}</li>
</ul>