【发布时间】:2018-06-23 05:21:35
【问题描述】:
我有一个类似电子表格的表格设置,它使用表格元素构建,这些表格元素使用角度来启用编辑,包括行选择/删除功能。 这是一个 html,如果它“被选中”,它可以突出显示一行:
<tr row-id="0" ng-class="selectedClass(5)" class="ng-scope budget-row">
<td>
<label id="foo" ng-hide="some_function(5)">{{row(5).value}}</label>
<input type="text" ng-hide="!some_function(5)">
</td>
<td>...</td>
</tr>
ng-class="selectedClass(5)" 用于在选中时为行应用背景色。
一旦选择了一行,就可以“剪切”它。在作用域上调用 cut 方法,它会移除底层的 row 对象并从 Dom 中移除元素,如下所示:
let el = angular.element("#foo");
let deleteTarget = el.parent().parent();
deleteTarget.remove();
这一切在页面上都可以正常工作,但我可以在控制台和堆栈跟踪中看到,即使从页面中删除了已删除的行,ng-class 指令仍然明显地触发它们。虽然它现在工作正常,但如果所有已删除的行仍在通过角度检查更改,即使它们不再出现在页面上,我可以看到它变得非常慢。
这是从已删除的元素调用“isSelected”函数的堆栈跟踪。
isSelected (budget_items.self-e32480dfbdba1522e84f3891a1bef58643f758332acf63bc6a7e4b06bfee6b49.js?body=1:688)
$scope.selectedClass (budget_items.self-e32480dfbdba1522e84f3891a1bef58643f758332acf63bc6a7e4b06bfee6b49.js?body=1:50)
fn (VM700:4)
expressionInputWatch (angular.self-78d77e4a3c91d5788f4be38711bc43955307738d52116f065bc1289f6abc3523.js?body=1:16661)
$digest (angular.self-78d77e4a3c91d5788f4be38711bc43955307738d52116f065bc1289f6abc3523.js?body=1:18364)
$apply (angular.self-78d77e4a3c91d5788f4be38711bc43955307738d52116f065bc1289f6abc3523.js?body=1:18641)
(anonymous) (angular.self-78d77e4a3c91d5788f4be38711bc43955307738d52116f065bc1289f6abc3523.js?body=1:27469)
dispatch (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:5184)
elemData.handle (jquery3.self-5af507e253c37e9c9dcf65064fc3f93795e6e28012780579975a4d709f4074ad.js?body=1:4992)
【问题讨论】:
-
像这样混合 jQuery 和 AngularJS 是自找麻烦。