范围值更改不会被$ watch in指令捕获

时间:2015-07-10 10:01:19

标签: javascript angularjs angularjs-scope

我正在关注here的文档。这是我按照建议创建的指令。

.directive('setFocusIf', function() {
  return {
    link: function($scope, $element, $attr) {
      $scope.$watch($attr.setFocusIf, function(value) {
        if (value) { $element[0].focus(); }
      });
    }
  };
});

我的标记:

<input set-focus-if="hasFocus" ng-focus="hasFocus = false">

<button type="button" ng-click="addItem()">Add</button>

addItem()函数执行某项操作并将hasFocus的值设置为true。但是,这不起作用,元素没有得到关注。调试时我发现$watch本身并没有被调用。

但是,当我在按钮中设置ng-click="hasFocus = true"之类的值而不是在hasFocus函数中将true设置为addItem()时完美无缺。

我尝试将其封在$apply中,但似乎无法正常工作,我对其内部结构并不十分清楚。我想我在这里缺少一些基础知识,有人可以指出这两种方法之间的区别。

此处显示问题的plunker

1 个答案:

答案 0 :(得分:0)

好的,在尝试了不同的东西后,我发现它与范围内的点有关。

我改变了这个

<input set-focus-if="hasFocus" ng-focus="hasFocus = false">

到这个

<input set-focus-if="focus.hasFocus" ng-focus="focus.hasFocus = false">

当然,addItem现在设置$scope.focus.hasFocus = true;

现在效果很好......

另一方面,我需要了解以这种方式设置焦点是否合适。因为这不适用于需要关注不同场合/事件的多个元素,除非修改指令以相应地工作。但是它仍然没有效率,因为$watch将被调用每个具有set-focus-if指令的元素。