表格刷新时保持行下拉

时间:2015-06-30 09:33:03

标签: javascript angularjs angular-ui-bootstrap

我有一张桌子,每隔几秒刷新一次。在每一行上,我都有一个下拉列表(来自ui.bootstrap),允许用户对该行执行操作。

问题是,从数据库获取新数据后,如果下拉列表打开,则会关闭。这对用户来说非常烦人。

我最初只是在行上有单独的按钮来执行操作,但我可以看到操作列表可能会增长,所以想要移动到下拉列表。

    <tbody ng-repeat="item in items">
        <tr>
            <td>{{item.name}}</td>
            <td>{{item.age}}</td>
            <td>
                <div class="btn-group" dropdown>
                    <button type="button" class="btn btn-sm btn-primary">Action</button>
                    <button type="button" class="btn btn-sm btn-primary" dropdown-toggle>
                        <span class="caret"></span>
                        <span class="sr-only">Split button!</span>
                    </button>
                    <ul class="dropdown-menu" role="menu">
                        <li><a>Edit</a>
                        </li>
                        <li><a href="#">Delete</a>
                        </li>
                        <li><a href="#">Something else here</a>
                        </li>
                        <li class="divider"></li>
                        <li><a href="#">Separated link</a>
                        </li>
                    </ul>
                </div>
            </td>
        </tr>
    </tbody>

我做了一个演示here的傻瓜,可能比在胡言乱语更容易!如果您点击下拉列表并等待几秒钟,您将看到它消失。

非常感谢任何建议。

修改: 感谢 Denocle 的回答,这里...... plunkr

...而且我在DOM中没有使用ID就稍微改进了他的方法,这里...... plunkr

感谢您的帮助和评论。

2 个答案:

答案 0 :(得分:1)

只要您拥有所有行的唯一ID,就可以在刷新之前保存打开下拉列的行的ID,然后在数据更新到添加后找到该行&#34;开&#34;在该行上的btn-group类。

我在这里用一个工作示例分发你的演示:http://plnkr.co/edit/6vwBnmbsJQvDxHoxLJ70

&#13;
&#13;
// Method for saving and restoring the correct dropdown

api.saveOpenBtnGroup = function() {
  this.openBtnGroupItemId = null;
  var openBtnGroup = document.getElementsByClassName('btn-group open');
  if (openBtnGroup.length > 0) {
    this.openBtnGroupItemId = openBtnGroup[0].getAttribute('data-item-id');
  }
}

api.restoreOpenBtnGroup = function() {
  if (this.openBtnGroupItemId !== null) {
    var btnGroup = document.querySelectorAll('[data-item-id="' + this.openBtnGroupItemId + '"]');
    if (btnGroup.length == 1) {
      console.log(btnGroup[0].className);
      btnGroup[0].className = btnGroup[0].className + ' open';
      console.log(btnGroup[0].className);
    }
  }
}
&#13;
<!-- Adding the unique item id to the btn-group so we can find it later -->
<div class="btn-group" dropdown data-item-id="{{item.id}}">
&#13;
&#13;
&#13;

答案 1 :(得分:1)

作为替代方案,如果您只是更改数组的内容,而不是更改数组本身,则下拉列表将保持打开状态:

function getItems() {
    $scope.i++;
    console.log("refresh");
    //$scope.items = api.getStuff();
    angular.forEach($scope.items, function(item){
      item.age = Math.floor((Math.random() * 100) + 1);
    })
}