Я знаю, что он довольно старый, но, потратив часы своей жизни, я придумал супер грязный хак, который помогает (при условии, что я правильно понял ваш вопрос и у вас такой же проблема как у меня).
Постановка задачи
Использование вкладок UI Bootstrap, динамическое добавление вкладок на основе данных списка и поддержание активного состояния вне этих данных.
При использовании вкладок UI Bootstrap и создании таких вкладок:
<tab ng-repeat="item in page.data.list" active="item.active">
UI Bootstrap будет использовать привязку элемента для сохранения активного состояния. Если мы опустим активный атрибут, UI Bootstrap будет поддерживать его внутри, но тогда станет невозможно управлять активным состоянием извне, за исключением доступа к нему через один из следующих способов: $$
(какие неприкасаемые! )
Решение (Взлом)
Сохраните активное состояние в другом списке:
<div ng-controller="parasample-tabs">
{{activeState}}
<tabset ng-show="page.data.list.length">
<tab ng-repeat="item in page.data.list" active="activeState[$index]">
<tab-heading>
<i style="cursor: pointer" class="glyphicon glyphicon-remove" ng-click="delTab($index)" prevent-default></i>
Item {{$index +1}}
</tab-heading>
{{item.text}} - {{item.transcript}} - {{item.active}}
</tab>
</tabset>
<!--
For me this problem arose because I like to use self-contained, self-managing data
from factories, hence I call addItem not on a controller
-->
<button ng-click="page.addItem()">Add Item</button>
</div>
Теперь о контроллере, который окружает эти вкладки и управляет ими, а также их активным состоянием, а не записывает его в мои данные:
app.controller('parasample-tabs', function ($scope) {
$scope.maxItems = 5;
$scope.activeState = [];
$scope.delTab = function (idx) {
var list = $scope.page.data.list;
if (list.length > 0) {
$scope.page.delItem(idx);
$scope.activeState.splice(idx, 1);
}
};
$scope.$watch(
"page.data.list.length",
function (newLen, oldLen) {
if (!newLen) return;
// new item => new tab, make active
if (newLen > oldLen)
$scope.activeState.push("true");
}
);
});
Теперь UI Bootstrap получит доступ к массиву activeState
и сохранит там активное состояние. В инициализации нет необходимости, так как об этом позаботятся.
Когда в наш список данных добавляется новый элемент, часы установят новую вкладку как активную (это я предпочитаю), а остальная часть списка будет обновлена с помощью UI Bootstrap.
Однако при удалении нелегко определить, какой элемент был удален, поэтому мне пришлось заключить свой page.delItem
в метод delTab
контроллера.
Вот и скрипка, с которой можно поиграть.
Будем надеяться, что UI Bootstrap позволит другим способом поддерживать активное состояние вместо двусторонней привязки в активном атрибуте. Мне нравится иметь переменную «активный идентификатор».
Заявление об ограничении ответственности: мне известно, насколько это грязно, и я пока тестировал его только в Chrome, и он отлично работает.
person
enpenax
schedule
20.03.2015