2015-07-10 66 views
1

我正在关注来自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()功能做一些事情,并设置的hasFocustrue值。但是,这不起作用,并且该元素没有得到关注。在调试时,我发现$watch本身没有被调用。

然而,当我在按钮,而不是在addItem()功能设置hasFocustrue设置像ng-click="hasFocus = true"值,它完美的罚款。

我试着把它放在$apply里,但似乎没有工作,而且我的内部也不是很清楚。我想我在这里错过了一些基础知识,有人可以指出这两种方法有什么区别。

这里的显示问题

+0

尝试$元素并删除$元素[0] –

+0

这里的问题是'$ watch'没有被触发。所以你的建议不适用于此。 –

+0

你可以创建一个plunker吗? –

回答

0

OK了plunker,尝试不同的东西之后,我想通了,它是与范围的点。

我改变了这种

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

这个

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

而且ofcourse,addItem现在设置$scope.focus.hasFocus = true;

它完美现在......

在一个侧面说明,我需要了解这样设置焦点是否正确。因为这不适用于需要关注不同场合/事件的多个元素,除非该指令被修改为相应地工作。但仍然不会有效,因为$watch将被调用的每个元素有set-focus-if指令。