删除数组中没有更新视图的项目

时间:2017-03-27 21:38:56

标签: angularjs angular-ui-bootstrap

我的视图中有这样的dinamic标签(Angular UI Bootstrap):

 <uib-tabset active="1" id="tabs" class="col-md-10">
            <uib-tab ng-repeat="tab in filaCtrl.tabs" ng-click="filaCtrl.getChatTab(tab.protocolo)">
                <uib-tab-heading >
                    <div style='display: flex; align-items: center; justify-content: center;'>
                        <h5 style='margin-right: 10px;'>Protocolo: {{tab.protocolo}}</h5>
                        <h7 ng-md-icon icon='cancel' style='fill:#F44336' size='16' ng-click='filaCtrl.closeTab(tab.protocolo, $index)'><h7>
                    <div>
                </uib-tab-heading>
            <div class="tab-content">
(...)

我的函数filaCtrl.closeTab()删除一个制表符,即数组filaCtrl.tabs中的一个项目。但是当项目被删除时,视图会更新并“关闭”所有标签,即刷新页面。

self.closeTab = function (protocolo, $index) {
          self.tabs.splice($index, 1);
        };

如何在不刷新页面的情况下删除项目?

2 个答案:

答案 0 :(得分:0)

这是Angular中的预期行为(以及数据绑定的神奇之处)。您需要复制self.tabs并在ng-repeat

中使用该副本
self.tabsCopy = angular.copy(self.tabs);

然后你可以做

<uib-tab ng-repeat="tab in filaCtrl.tabsCopy" ng-click="filaCtrl.getChatTab(tab.protocolo)">

但请注意,您的closeTab函数使用数组中选项卡的索引。因此,如果用户关闭多个标签页,则会遇到问题,因为tabstabsCopy数组会有所不同。

更好的方法是使用某种变量(如tab.opentab.closed)来跟踪标签的状态。然后你可以做类似

的事情
<uib-tab ng-repeat="tab in filaCtrl.tabs" ng-click="filaCtrl.getChatTab(tab.protocolo)">
  <uib-tab-heading ng-if="tab.open>
    ...

答案 1 :(得分:0)

ng-repeat执行双向绑定,以便在视图中更改的对象更新控制器,反之亦然。

如果要对tabs数组进行一次性绑定,可以将ng-repeat语句定义为:

<uib-tab ng-repeat="tab in ::filaCtrl.tabs" ng-click="filaCtrl.getChatTab(tab.protocolo)">

请注意,::语法将一次性绑定您的数组。