我有一个昂贵的函数调用,每个循环调用一次,但我想将它的返回值设置为可以直接在循环中使用的临时变量。
这通过设置起作用{{ val=fn(...) }}
,但它也打印到屏幕上。是否可以在不打印值的情况下执行此操作?
我试过使用一组花括号{}
,但它不起作用。
关于如何做到这一点的任何想法?
我有一个昂贵的函数调用,每个循环调用一次,但我想将它的返回值设置为可以直接在循环中使用的临时变量。
这通过设置起作用{{ val=fn(...) }}
,但它也打印到屏幕上。是否可以在不打印值的情况下执行此操作?
我试过使用一组花括号{}
,但它不起作用。
关于如何做到这一点的任何想法?
您是否查看过“过滤器”或可能在您的 JS 代码中而不是视图中进行工作?
在需要值时调用方法而不是临时变量,并在此方法中使用结果的缓存版本,或者如果缓存版本为空/未定义,则调用昂贵的方法。每次迭代它只会调用一次昂贵的函数,如果不需要它就不会调用它。除非您愿意,否则它不会打印。因为 ng-repeat 的每次迭代都会产生一个新范围,所以每次迭代都将从一个空缓存开始。
例如:
$scope.cache = null
$scope.getValue = function() {
if (!this.cache) { // use typeof if 0 or false or empty string is valid!
this.cache = myExpensiveFunc()
}
return this.cache
}
不是 100% 肯定 $scope.cache = null 将为迭代的每个范围初始化,您可能需要检查 getValue 中是否有 'this' hasOwnProperty 'cache'。因此,在您看来,只有在需要时才引用 getValue()。
!
编辑:缓存在范围内,而不是在控制器中。