table 刷新时保持行下拉
Sustain dropdown on row while table refreshes
我有一个 table 每隔几秒刷新一次。在每一行上,我都有一个下拉列表(来自 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>
我已经做了一个 plunkr 来演示 here,可能比胡扯更容易!如果您单击下拉菜单并等待几秒钟,您会看到它消失了。
非常感谢任何建议。
编辑:
感谢 Denocle 的回答,这里... plunkr
...而且我在 DOM 中略微改进了他的方法,这里...plunkr
感谢您的帮助和评论。
只要您的所有行都有唯一的 ID,就可以在刷新之前保存打开下拉列表的行的 ID,然后在数据更新到将 "open" class 添加到该行的 btn 组。
我在这里用一个工作示例分叉了你的演示:http://plnkr.co/edit/6vwBnmbsJQvDxHoxLJ70
// 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);
}
}
}
<!-- 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}}">
作为替代方案,如果您只是更改数组的内容,而不是更改数组本身,下拉列表将保持打开状态:
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);
})
}
我有一个 table 每隔几秒刷新一次。在每一行上,我都有一个下拉列表(来自 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>
我已经做了一个 plunkr 来演示 here,可能比胡扯更容易!如果您单击下拉菜单并等待几秒钟,您会看到它消失了。
非常感谢任何建议。
编辑: 感谢 Denocle 的回答,这里... plunkr
...而且我在 DOM 中略微改进了他的方法,这里...plunkr
感谢您的帮助和评论。
只要您的所有行都有唯一的 ID,就可以在刷新之前保存打开下拉列表的行的 ID,然后在数据更新到将 "open" class 添加到该行的 btn 组。
我在这里用一个工作示例分叉了你的演示:http://plnkr.co/edit/6vwBnmbsJQvDxHoxLJ70
// 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);
}
}
}
<!-- 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}}">
作为替代方案,如果您只是更改数组的内容,而不是更改数组本身,下拉列表将保持打开状态:
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);
})
}