2012-08-11 44 views
0

我有一个昂贵的函数调用,每个循环调用一次,但是我想将它的返回值设置为可以在循环中直接使用的临时变量。AngularJS评估一个插值表达式而不打印到屏幕

这项工作通过设置{{ val=fn(...) }},但它也打印到​​屏幕上。是否可以在不打印价值的情况下做到这一点?

我试过使用一套大括号{},但它不起作用。

有关如何做到这一点的任何想法?

回答

1

你看过“过滤器”或可能在你的JS代码而不是视图做的工作?

+0

我没有考虑过滤器。它的这样一个基本的操作,我想看看是否有可能不使用过滤器。 – matsko 2012-08-11 21:09:55

+2

以我的经验,我发现这不太可能。学习如何构建过滤器,虽然最初看起来过度杀伤,但仍会保持JS的模板清洁,这是AngularJS的'方式'... – 2012-08-11 22:46:18

1

而不是临时变量,当您需要该值时调用方法,并且在此方法中使用缓存版本的结果,或者如果缓存版本为null/undefined,则调用昂贵的方法。它只会在每次迭代中调用一次昂贵的函数,如果不需要它,它将不会调用它。它不会打印它,除非你想。因为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检查“这个” hasOwnProperty“缓存”。因此,在您看来,您只需在需要时引用getValue()。

HTH!

编辑:缓存范围,不在控制器。