可以观看'想念'?

时间:2015-04-23 13:00:45

标签: angularjs angularjs-directive

我们有以下指令:

app.directive("counterWidget",function(){
  return{
    restrict:"E",
    scope:{
      startnumber: '=',
      resetter: '='
    },
    link:function(scope,elem,attr){
        scope.f =  attr.startnumber;
        scope.add = function(){             
            scope.f++
        }
        scope.remove = function(){
            scope.f--
        }
        scope.reset = function(){
            scope.f = attr.startnumber
            scope.$parent.triggerReset()
        }
        scope.$watch(function(attr) {
          return attr.resetter
        },
        function(newVal) {
          if (newVal === true) {
            scope.f = attr.startnumber;
          }
        })

    },
    template:"<button ng-click='add()'>more</button>"+
             "{{f}}"+
             "<button ng-click='remove()'>less</button>&nbsp"+
             "<button ng-click='reset()'>reset</button><br><br>"
    }

  })

在这个指令中有一个watch函数,它监视resetter属性的变化。该属性由控制器中的此函数触发:

$scope.triggerReset = function () {
    $scope.reset = true;
    console.log('reset')
    $timeout(function() {
      $scope.reset = false; 
    },100)
}

问题出现了 - 可以观看&#39;想念&#39;?如果超时时间太短,或者......我不知道......由于某些原因导致其挂起的其他原因,它是否无法捕捉到切换?

我有以下演示: 的 Plunker

我将超时设置为1毫秒,甚至将它们全部一起删除,它仍然可以正常重置。但是,有些情况会出现在手表变得不可靠的情况下吗?

1 个答案:

答案 0 :(得分:0)

没有。你甚至可以将它设置为0毫秒,它仍然会捕获。

$timeout将始终使其函数内部的代码在与当前代码不同的$digest周期内运行。

另一方面,

$evalAsync可能会导致错过,具体取决于具体情况。

有关详细信息,请参阅此答案:https://stackoverflow.com/a/16066461/624590

编辑:我错过了一个边缘案例,其中第三个参数传递给$timeout函数。如果您致电$timeout(fn, 50, false)(注意结尾处的false),它将跳过$apply步骤并允许您“错过”更改。这基于$timeout源代码:https://github.com/angular/angular.js/blob/master/src/ng/timeout.js#L64