我知道这已经很老了,但是在浪费了我的生命之后,我想出了一个超级 肮脏的 hack,它可以解决问题(假设我正确理解了你的问题并且你和我有同样的问题)。
问题陈述
使用 UI 引导选项卡,根据列表数据动态添加选项卡,并在此数据之外保持活动状态。
当使用 UI Bootstrap 的 Tabs 并生成如下标签时:
<tab ng-repeat="item in page.data.list" active="item.active">
UI Bootstrap 将使用项目的绑定来存储活动状态。如果我们省略 active 属性,UI Bootstrap 将在内部维护它,但随后就无法从外部操纵活动状态,除非通过以下之一访问它:$$(这是不可触碰的! em>)
解决方案(黑客)
在另一个列表中保持活动状态:
<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 方法中。
Here 也是个小玩意儿。
我们希望 UI Bootstrap 允许以不同的方式保持活动状态,而不是在活动属性中进行双向绑定。我喜欢有一个“活动 ID”变量。
免责声明:我知道这有多脏,到目前为止我只在 Chrome 中测试过它,它运行良好。