2016-01-05 64 views
1

正當我以爲我知道Angular相當體面,我遇到這種情況:「幽靈」ng鍵功能

有人可以解釋這是如何可能嗎?

DEMO:http://jsfiddle.net/u08jgd4g/1/

HTML

<div ng-controller="MyCtrl"> 

    <button ng-click="WTF" ng-bind="labelText()"></button> 

    <div ng-show="showMe()"> 
    Hello, World! 
    </div> 

</div> 

JS

var myApp = angular.module('myApp',[]); 

function MyCtrl($scope) { 

    var show = true; 

    $scope.labelText = function() { 
     return !show ? 'Hide' : 'Show'; 
    }; 

    $scope.showMe = function() { 
     show = !show; 
     return show; 
    }; 

}; 

如果您還沒有抓到問題尚未:按鈕具有ng-click功能不e xist,但是當你點擊按鈕時,div切換並且按鈕值發生變化。

回答

3

這不是因爲該功能不存在,這是因爲該點擊正在觸發$digest週期。所以循環運行並評估您的ngShowngBind函數。

這兩個函數只是簡單地將一個變量翻轉到與原來相反的位置並應用結果。所以發生的一切就是觸發一個摘要循環,並跳過視圖中綁定的函數。

+0

很棒的解釋... – katmanco

+0

感謝您的知識,好先生 – rcorrie

1

發生這種情況的原因是您已使用ng-click函數,該函數在ng-click指令中給出的表達式評估後運行摘要循環。得到所有的watcher函數得到評估,爲什麼你的價值每次點擊切換。

在您使用ng-show指令的表達式的背景下,角度將內部表達式放入watcher數組中,該數組在對象下。您可以在$scope.$$watchers對象內看到watcher的對象集合。