说我有一个大阵列的ng-repeat。
ng-repeat运行时,它将数组的每个元素添加到隔离的作用域中,并将数组本身包含在作用域中。这意味着$
digest会检查整个数组是否有更改,最重要的是,它会检查该数组中的 每个单独元素 是否有更改。
看到这个傻瓜是我在说什么的例子。
在我的用例中,我永远不会更改数组的单个元素,因此不需要监视它们。我只会更改整个数组,在这种情况下ng-
repeat会重新呈现整个表。(如果我对此有误,请告诉我。)
在(例如)1000行的数组中,那是我不需要再计算的1000个表达式。
如何在仍然监视主数组的同时从观察者注销每个元素?
也许不用注销,我可以更好地控制$ digest并以某种方式跳过每一行?
实际上,这种特定情况是更普遍问题的一个示例。我知道$
watch返回一个’deregisteration’函数,但这在大多数情况下在指令注册手表时没有帮助。
要拥有一个大阵列的中继器,您不必看就可以观看每个项目。
您需要创建一个自定义指令,该指令需要一个参数和表达式到您的数组,然后在链接函数中只需观察该数组,然后让链接函数以编程方式刷新HTML(而不是使用ng-
repeat)
类似于(伪代码):
app.directive('leanRepeat', function() {
return {
restrict: 'E',
scope: {
'data' : '='
},
link: function(scope, elem, attr) {
scope.$watch('data', function(value) {
elem.empty(); //assuming jquery here.
angular.forEach(scope.data, function(d) {
//write it however you're going to write it out here.
elem.append('<div>' + d + '</div>');
});
});
}
};
});
…这似乎是一种痛苦。
替代骇客方法
您也许可以循环浏览$scope.$$watchers
并检查$scope.$$watchers[0].exp.exp
它是否与您要删除的表达式匹配,然后通过一个简单的splice()
调用将其删除。这里的PITA是Blah {{whatever}} Blah
标记之间的东西将是表达式,甚至包括回车符。
从好的方面来说,您也许可以通过ng-repeat的$ scope循环并删除所有内容,然后显式添加所需的手表……我不知道。
无论哪种方式,似乎都像是骇客。
删除$ scope制造的观察者。
您可以$watch
使用调用返回的功能注销a $watch
:
例如,一次$watch
只能开火:
var unregister = $scope.$watch('whatever', function(){
alert('once!');
unregister();
});
当然,您可以随时调用unregister函数……这只是一个例子。
结论:确实没有一种很好的方法可以完全满足您的要求
但是要考虑的一件事:甚至值得担心吗?此外,将数千个记录加载到数十个DOMElement中真的是一个好主意吗?值得深思。
希望对您有所帮助。
编辑2(删除坏主意)
我正在Windows.NET环境中使用RabbitMQ、ActiveMQ“Classic”和ActiveMQ Artemis进行一些测试。RabbitMQ和ActiveMQ“Classic”附带了一个web界面,您可以在其中看到关于代理、队列、消息等的信息,但ActiveMQ Artemis没有。我非常希望能够在web界面或至少使用一些cmd/powershell命令来监视我的ActiveMQ A
问题内容: 我在JBoss战争中使用的是Hibernate,使用c3p0进行连接池,两者均在类路径的hibernate.cfg.xml配置文件中配置 我看过server.log生成包含有关连接池的有趣信息的行: 调试[com.mchange.v2.resourcepool.BasicResourcePool]跟踪com.mchange.v2.resourcepool.BasicResourcePo
问题内容: 如果要花费10秒钟以上的时间才能取消操作? 我正在使用巨大的正则表达式来匹配特定的文本,有时可能有用,有时可能会失败… 正则表达式: 工作示例:https://regex101.com/r/kU6rS5/1 所以..如果要花费10秒以上,我想取消操作。可能吗?我找不到与沙发有关的任何东西 谢谢。 问题答案: 您可以生成一个进行正则表达式匹配的子进程,并在10秒钟内未完成将其杀死。可能有
问题内容: 我正在寻找一种列出数据库中所有视图的方法。 最初,我在MySQL论坛上找到并尝试了一个答案: 这怎么行不通,返回一个空集。(我知道他们在那里!) 这些也会失败: 为什么这不起作用? 问题答案: MySQL查询以查找数据库中的所有视图
如何在不包含连续子字符串baa的字母表{a,b,c}上表达正则表达式?
问题内容: 我有一个Java应用程序连接到远程Oracle数据库上的视图。 有谁知道Java中监视此表更改的方法吗?即,如果有更新的插入等,我需要做出反应。 问题答案: 您可以在表上放置INSERT / UPDATE / DELETE触发器,以在对表进行“数据”更改时执行某些操作。(而不是更改表的结构) 我相信10g也支持视图触发器。 但是我不确定您如何通过轮询来通知其他Java进程。 抱歉。 您