2014-02-24 116 views
0

我下面thinksters角NFL幻想教程這裏http://www.thinkster.io/angularjs/eHPCs7s87O/angularjs-tutorial-learn-to-rapidly-build-real-time-web-apps-with-firebase他們實現納克級的活躍在這種方式...角試圖理解方法,以檢查是否元素isActive

<li data-ng-repeat="entry in navbarEntries" data-ng-show="auth" data-ng-class="{ active: entry.isActive }"> 


$scope.$on('$routeChangeSuccess', function() { 
    $scope.navbarEntries.forEach(
     function(data) { 
     data.isActive = ($location.path().indexOf(data.link) == 0); 
     } 
    ) 
    }) 

他們有這樣的解釋下面的執行...

「爲什麼,你可能會問,難道你不只是調用從視圖的方法,如果它應該是主動或不這將評估?

原因是$摘要循環再評估,這個循環發生得非常非常通常情況下,您在視圖中用於評估屬性的每個方法調用都將在每個週期重新調用,這顯然會隨着應用程序的擴展而降低性能。「

我想知道它會看起來像「從視圖調用方法」,什麼「評估屬性」的意思,並希望多一點的解釋在什麼情況下使用這樣的避免$消化週期重新評估在角度上是適當的。

回答

1

撥叫視圖的方法會是這個樣子:

<li ng-class="{active: urlIsActive('/home/')}"><a href="#/home/">Home</a></li> 

然後urlIsActive將在範圍內的功能,如:

$scope.urlIsActive = function(url) { 
    return ($location.path().indexOf(url) == 0); 
} 

這種方法的問題是必須在每個範圍摘要循環中重新評估函數urlIsActive,這會浪費很多性能。他們建議的方法是使用事件來操作範圍變量,而在性能方面則更便宜。

請注意,建議的範圍變量操作發生在事件觸發時。在呈現頁面時,查明鏈接是否應該是活動的,只是一個簡單的變量查找,而不是實際執行一個函數(本身有很多開銷)。

+0

你能解釋頁面渲染示例多一點嗎?我猜$ $ routeChangeSuccess會被觸發,並且該函數將被評估,對吧?那麼如何在模板中調用它更有效率呢{active:urlIsActive('/ home /')} – natecraft1

+0

這個例子中的差異可能不會很明顯,因爲'urlIsActive'就是一個很小的例子。但是,將函數調用的次數儘可能少(但不要低)是個好主意。 我們知道'urlIsActive'的結果在路由更改之間是相同的。只要路由發生變化,即值可能改變,事件'$ routeChangeSuccess'就會被觸發。從模板中調用它會導致在所有摘要循環中評估函數(經常發生!),這是浪費的。僅從事件調用允許Angular只檢查一些變量值。 – Mikke

相關問題