Angularjs 如何';取消插接';表情
假设我有一个大数组的ng重复 当ng repeat运行时,它会将该数组的每个元素添加到一个独立的作用域中,并将数组本身添加到一个作用域中。这意味着$digest会检查整个数组的变化,最重要的是,它会检查该数组中的每个元素的变化 作为我所说的一个例子 在我的用例中,我从不更改数组中的一个元素,所以我不需要监视它们。我只会更改整个数组,在这种情况下,ng repeat将重新呈现整个表。(如果我错了,请让我知道……) 在一个(比如)1000行的数组中,我不需要计算另外1000个表达式 我如何在观看主阵列的同时从观察者注销每个元素? 也许我不需要取消注册,而是可以更好地控制我的$digest,并以某种方式跳过每一行Angularjs 如何';取消插接';表情,angularjs,Angularjs,假设我有一个大数组的ng重复 当ng repeat运行时,它会将该数组的每个元素添加到一个独立的作用域中,并将数组本身添加到一个作用域中。这意味着$digest会检查整个数组的变化,最重要的是,它会检查该数组中的每个元素的变化 作为我所说的一个例子 在我的用例中,我从不更改数组中的一个元素,所以我不需要监视它们。我只会更改整个数组,在这种情况下,ng repeat将重新呈现整个表。(如果我错了,请让我知道……) 在一个(比如)1000行的数组中,我不需要计算另外1000个表达式 我如何在观看主阵
这个具体案例实际上是一个更普遍问题的例子。我知道这一点,但当指令注册手表时,这并没有帮助,这在大多数情况下都是如此。要有一个带有大阵列的中继器,而您不需要观看它来观看每一项。 您需要创建一个自定义指令,该指令接受一个参数和数组的表达式,然后在链接函数中,您只需查看该数组,并让链接函数以编程方式刷新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();
});