При работе с фильтрами не используйте индекс для обновления массива
попробуйте это, здесь я передаю элемент в качестве фильтра, чтобы мы могли узнать, какой узел попросили свернуть или развернуть. Вы также можете использовать идентификатор для фильтрации массива.
<div>
<input type="text" ng-model="item.value">
<div ng-repeat="group in groups | filter:item.value">
<div class="parents" ng-click="open(group)"><i ng-class="{'glyphicon-minus': group.isOpen, 'glyphicon-plus': !group.isOpen}"></i> {{ group.title }}
</div>
{{ group.content }}
<ul class="childs" ng-show="group.isOpen">
<li ng-repeat="item in group.list">
<span ng-bind-html="item"></span>
</li>
</ul>
</div>
</div>
и ваш контроллер, мы используем этот элемент для фильтрации этого.
$scope.open = function (item) {
$scope.groups.filter(a=> a ===item).forEach(a=>{
a.isOpen = !a.isOpen;
});
$scope.closeOthers(item);
}
$scope.closeOthers = function (item) {
$scope.groups.filter(a=> a !==item).forEach(a=>{
a.isOpen = false;
});
}
Демо-версия плункера