Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何';取消插接';表情_Angularjs - Fatal编程技术网

Angularjs 如何';取消插接';表情

Angularjs 如何';取消插接';表情,angularjs,Angularjs,假设我有一个大数组的ng重复 当ng repeat运行时,它会将该数组的每个元素添加到一个独立的作用域中,并将数组本身添加到一个作用域中。这意味着$digest会检查整个数组的变化,最重要的是,它会检查该数组中的每个元素的变化 作为我所说的一个例子 在我的用例中,我从不更改数组中的一个元素,所以我不需要监视它们。我只会更改整个数组,在这种情况下,ng repeat将重新呈现整个表。(如果我错了,请让我知道……) 在一个(比如)1000行的数组中,我不需要计算另外1000个表达式 我如何在观看主阵

假设我有一个大数组的ng重复

当ng repeat运行时,它会将该数组的每个元素添加到一个独立的作用域中,并将数组本身添加到一个作用域中。这意味着$digest会检查整个数组的变化,最重要的是,它会检查该数组中的每个元素的变化

作为我所说的一个例子

在我的用例中,我从不更改数组中的一个元素,所以我不需要监视它们。我只会更改整个数组,在这种情况下,ng repeat将重新呈现整个表。(如果我错了,请让我知道……)

在一个(比如)1000行的数组中,我不需要计算另外1000个表达式

我如何在观看主阵列的同时从观察者注销每个元素?

也许我不需要取消注册,而是可以更好地控制我的$digest,并以某种方式跳过每一行


这个具体案例实际上是一个更普遍问题的例子。我知道这一点,但当指令注册手表时,这并没有帮助,这在大多数情况下都是如此。

要有一个带有大阵列的中继器,而您不需要观看它来观看每一项。

您需要创建一个自定义指令,该指令接受一个参数和数组的表达式,然后在链接函数中,您只需查看该数组,并让链接函数以编程方式刷新HTML(而不是使用ng repeat)

类似于(psuedo代码):

当然,您可以随时调用unregister函数。。。这只是一个例子

结论:没有什么好方法可以完全满足你的要求

但有一件事需要考虑:这甚至值得担心吗?此外,将数千条记录加载到几十个家庭元素中真的是个好主意吗?值得深思

我希望这有帮助



编辑2(删除坏主意)编辑:查看我发布的其他答案

我已经以一种不同的方式实现了布莱什的想法。我的
ngOnce
指令只是销毁
ngRepeat
在每个项上创建的子范围。这意味着无法从其父级的
作用域访问该作用域。$digest
,并且从未执行监视程序

指令本身:

angular.module('transclude',[])
.directive('ngOnce',['$timeout',function($timeout){
返回{
限制:“EA”,
优先:500,
是的,
模板:“”,
编译:函数(远程通讯、tAttrs、转置){
返回函数postLink(范围、IELENT、iAttrs、控制器){
$timeout(作用域)$destroy.bind(作用域),0;
}
}
};
}]);
使用它:

  • {{item.title}}:{{item.text}
  • 注意
    ng once
    不会创建自己的作用域,这意味着它会影响同级元素。这些都做了同样的事情:

  • {{item.title}}:{{item.text}
  • {{item.title}}:{{item.text}
  • {{item.title}}:{{item.text}

  • 注意

    您可以将
    bindonce
    指令添加到
    ng repeat
    中。您需要从下载它

    编辑:一些注意事项:

    如果在模板中使用
    {{}
    插值,则需要将其替换为

    如果您使用的是
    ng-
    指令,则需要将它们替换为正确的
    bo-
    指令


    此外,如果将
    bindonce
    ng repeat
    放在同一个元素上,则应尝试将
    bindonce
    移动到父元素(请参见)或将
    track by
    添加到
    ng repeat

    如果使用的是
    angularjs 1.3
    或更高版本,则可以使用单绑定语法

    <li ng-repeat="item in ::contents">{{item}}</li>
    
  • {{{item}
  • 这将绑定该值,并在第一个摘要循环运行且值第一次从
    未定义
    更改为
    已定义
    后删除观察程序


    这是一个非常有用的方法。

    $watch返回一个函数,调用该函数时,该函数将解除$watch的绑定。这就是“watchOnce”所需的全部内容:


    谢谢你,回答得很好。我将尝试这些选项,并将以最有效的方式回应。re:这甚至值得担心吗?它在Chrome中很好,但在IE中却扼杀了我们。我们(目前)使用无限滚动来拉下更多的记录,因此在大多数情况下,我们在初始加载时的20个左右的时间足够快。但是,如果用户不断滚动,可能会有很多记录。没关系。。。一切都让我心碎我建议使用某种系统,只将滚动中可见的内容放入DOM中。也许可以尝试ng grid@blesh-对于您的最后一次编辑,这会解决问题吗?我知道它不会更新用户界面,但它仍然会更新,但手表中的每一行对象都会更少,不是吗?@RoyTruelove,是的,我想你是对的。可能唯一确定的赌注是创建自己的指令来为您重复。我已将其插入我的一个数据网格中,该网格显示20列,但在100行之后仍然滞后。如果我将某个文本的列中的数据(如“数据”)切换出去,那么它不会延迟。我使用的是bo文本,但仍然遇到问题。遗憾的是,没有一个只在触发事件时更新的异步ng repeat。这会让生活更轻松!
    var unregister = $scope.$watch('whatever', function(){ 
         alert('once!');
         unregister();
    });
    
    <li ng-repeat="item in ::contents">{{item}}</li>
    
    var unwatchValue = scope.$watch('value', function(newValue, oldValue) {
      // Do your thing
      unwatchValue();
    });