"鬼" ng-click功能

时间:2016-01-05 15:48:29

标签: javascript angularjs angular-digest

就在我认为我非常认识Angular的时候,我遇到了这种情况:

有人可以解释一下这是怎么回事吗?

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功能,但当您点击该按钮时,div会切换并且按钮值会发生变化。

2 个答案:

答案 0 :(得分:3)

这不是因为该功能不存在,而是因为该点击触发$digest周期。因此,循环会运行并评估您的ngShowngBind函数。

这两个函数只是将变量翻转到与它相反的变量并应用结果。因此,所有发生的事情都是触发摘要周期并使您在视图中绑定的函数跳闸。

答案 1 :(得分:1)

这种情况正在发生,因为您使用了ng-click函数,该函数在评估ng-click指令上给出的表达式后运行摘要循环。所有watcher函数的结果将被评估为什么您的值在每次点击时都会切换。

当您使用带有表达式的ng-show指令时,在场景后面,angular会将该表达式放在watcher对象下面的$scope数组中。您可以在watcher对象中看到$scope.$$watchers对象的集合。