Javascript 范围值更改不会发生';不要在指令中被$watch抓住

Javascript 范围值更改不会发生';不要在指令中被$watch抓住,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我正在跟踪来自的文档。这是我根据建议创建的指令 .directive('setFocusIf', function() { return { link: function($scope, $element, $attr) { $scope.$watch($attr.setFocusIf, function(value) { if (value) { $element[0].focus(); } }); } }; }); 和我的标记

我正在跟踪来自的文档。这是我根据建议创建的指令

.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”
而不是在
addItem()
函数中将
hasFocus
设置为
true
时,它工作得非常好

我尝试将它封装在
$apply
中,但似乎不起作用,而且我对它的内部结构不是很清楚。我想我在这里遗漏了一些基本原理,请有人指出这两种方法之间的区别


这是一个显示问题的例子

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

我改变了这个

<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
,如果
指令设置焦点。

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

我改变了这个

<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

它现在工作得很好


另一方面,我需要了解这样设置焦点是否正确。因为这不适用于需要关注不同场合/事件的多个元素,除非相应地修改该指令。但是它仍然没有效率,因为对每个具有
设置焦点if
指令的元素都会调用
$watch

尝试$element并删除$element[0]这里的问题是
$watch
不会被触发。所以你的建议不适用于这里。你能创建一个plunker吗?你能在添加控制器的地方提供html代码吗。或者只创建fiddle您可以在hasFocus而不是attributery$element上应用$scope.$watch并删除$element[0]这里的问题是,
$watch
不会被触发。所以你的建议不适用于这里。你能创建一个plunker吗?你能在添加控制器的地方提供html代码吗。或者只创建fiddle,您可以在hasFocus而不是attribute上应用$scope.$watch