当前位置: 首页 > 面试题库 >

如何“取消监视”表达式

邵奇
2023-03-14
问题内容

说我有一个大阵列的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进程。 抱歉。 您