angularjs - 从一个表向另一个表添加和删除行 - AngularJS
问题描述
我们的团队正在 ServiceNow 中开发,并且需要将“发送”表中的行添加到“接收”表中,并从“接收”表中删除行并将其返回给“发送”:
我们已经确定了本练习的添加部分,但无法让返回部分正常工作。有时它会完全正常工作。其他时候,当我们删除时,它会取消选中“发送”表中的正确条目,但该条目将保留在“接收”表中。
在我们的“Sending”表上,它正在接收这样的 rootScope:
<tbody>
<tr ng-repeat="item in data.list track by item.sys_id">
<td ng-if="options.show_checkboxes">
<input type="checkbox"
ng-checked="item.isRowSelected"
ng-click="toggleSelection(item);" >
</td>
<td role="cell" class="pointer sp-list-cell"
ng-class="{selected: item.selected}"
ng-click="go(item.targetTable, item)"
ng-repeat="field in ::data.fields_array" data-field="{{::field}}"
data-th="{{::data.column_labels[field]}}">
<span ng-if="$first"
aria-label="${Open record}: {{::item[field].display_value}}"
role="link" tabindex="0">
{{::item[field].display_value | limitTo : item[field].limit}}
{{::item[field].display_value.length > item[field].limit ? '...' : ''}}
</span>
<span ng-if="!$first">
{{::item[field].display_value | limitTo : item[field].limit}}
{{::item[field].display_value.length > item[field].limit ? '...' : ''}}
</span>
</td>
</tr>
</tbody>
$scope.selectedItems = [];
$scope.toggleSelection = function(item){
item.isRowSelected = !item.isRowSelected;
if(item.isRowSelected==false){
$scope.allSelected=false;
if($scope.selectedItems.indexOf(item.sys_id)!==-1){
var add = $scope.selectedItems.indexOf(item.sys_id);
$scope.selectedItems.splice(add,1);
}
} else {
if($scope.selectedItems.indexOf(item.sys_id)==-1){
$scope.selectedItems.push(
item
);
$rootScope.$broadcast('moveItem', $scope.selectedItems);
}
}
}
$rootScope.$on('deleteItem', function(event, data) {
$scope.selectedItems = data;
});
在我们的“接收”表小部件中,我们的代码如下所示:
<tbody>
<tr ng-repeat="item in data.list2 track by item.sys_id">
<td role="cell" class="pointer sp-list-cell"
ng-class="{selected: item.selected}"
ng-click="go(item.targetTable, item)"
ng-repeat="field in ::data.fields_array"
data-field="{{::field}}" data-th="{{::data.column_labels[field]}}">
<span ng-if="$first"
aria-label="${Open record}: {{::item[field].display_value}}"
role="link" tabindex="0">
{{::item[field].display_value | limitTo : item[field].limit}}
{{::item[field].display_value.length > item[field].limit ? '...' : ''}}
</span>
<span ng-if="!$first">
{{::item[field].display_value | limitTo : item[field].limit}}
{{::item[field].display_value.length > item[field].limit ? '...' : ''}}
</span>
</td>
<td>
<a href="javascript:void(0)" ng-click="deleteSelection(item);">
Remove
</a>
</td>
</tr>
</tbody>
$scope.deleteSelection = function(item){
item.isRowSelected =false;
var minus = $scope.data.list2.indexOf(item.sys_id);
$scope.data.list2.splice(minus, 1);
$rootScope.$broadcast('deleteItem', $scope.data.list2);
}
$rootScope.$on('moveItem', function(event, data) {
$scope.data.list2 = data;
$scope.data.row_count = data.length;
});
解决方案
避免$rootScope.$on
——它有内存泄漏的风险
在其操作过程中,AngularJS 添加和删除 DOM 及其附加的指令和控制器。$rootScope.$on
删除指令或控制器时,不会自动删除由添加的侦听器函数。这可能会导致内存泄漏和不良行为。
为避免内存泄漏,请将事件侦听器添加到$scope
控制器,而不是$rootScope
:
̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶'̶d̶e̶l̶e̶t̶e̶I̶t̶e̶m̶'̶,̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶(̶e̶v̶e̶n̶t̶,̶ ̶d̶a̶t̶a̶)̶ ̶{̶
$scope.$on('deleteItem', function(event, data) {
$scope.selectedItems = data;
});
为避免注入$rootScope
,请使用$scope.$root
:
̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶b̶r̶o̶a̶d̶c̶a̶s̶t̶(̶'̶m̶o̶v̶e̶I̶t̶e̶m̶'̶,̶ ̶$̶s̶c̶o̶p̶e̶.̶s̶e̶l̶e̶c̶t̶e̶d̶I̶t̶e̶m̶s̶)̶;̶
$scope.$root.$broadcast('moveItem', $scope.selectedItems);
推荐阅读
- react-native - 如何在反应natvie中滚动到滚动视图的开头
- python-3.x - 如何将存储在 YYYYMMDD 中的日期转换为 pandas 中的日期时间格式
- knockout.js - 淘汰赛绑定后如何访问DOM元素?
- python - NumPy 数组的滚动/增加维度
- javascript - Angular5:window.addEventListener 卡住浏览器选项卡
- c - 如何在单线程服务器上处理多个客户端(使用套接字)
- plone - 删除 Plone 错误页面上的 HTTP 标头
- python - CV2.rectangle 在 Windows 上需要整数,但在 Ubuntu 上使用浮点数
- sql-server - 想在 SQL Server 中使用变量动态更改数据库,怎么做?
- reactjs - 为什么我的删除按钮无法在 React 中正确呈现?