在小提琴中,如果您是第一次点击提交按钮,请注意<input>
正确关注。在随后的点击中,焦点不再设置。
我注意到当$observe
更改submit()
时,isFocused
回调没有被触发,所以我添加了一个blur
侦听器来显式重置变量但是没有帮助。
如何将焦点放在提交上?
修改:Final working fiddle。使用$watch
代替,因为我希望它可以使用任意表达式
答案 0 :(得分:2)
如果您观察该元素,您会注意到在触发模糊回调时,focus-on
属性未设置为false。原因是blur
函数超出了角度的范围,所以它不知道你在其中做出的改变。
要使角度意识到更改,您需要在调用$apply
内包装任何更改element.bind('blur', function () {
scope.$apply(function() {
scope.isFocused = false;
console.log('blur');
});
});
答案 1 :(得分:0)
我认为你不能观察focusOn
属性,因为它并不真正作为指令的属性存在。执行<input focus-on='{{isFocused}}' />
时,focus-on
实际上是您的指令名称。
请改为尝试:
<强> HTML 强>
<div ng-app='foo'>
<form ng-controller='FormCtrl' ng-submit='submit()'>
<input focus-on focused='isFocused' />
<button>Submit</button>
</form>
</div>
<强>的Javascript 强>
app.directive('focusOn', function () {
return {
scope: { focused: '=' },
link: function(scope, element) {
scope.$watch('focused', function (newValue) {
console.log('$watch', newValue)
if (newValue) {
element[0].focus();
}
});
element.bind('blur', function () {
scope.focused = false;
scope.$apply(); // required so that the scope is updated correctly.
console.log('blur');
});
}
};
});
app.controller('FormCtrl', function ($scope) {
$scope.submit = function () {
$scope.isFocused = true;
console.log('submit');
};
});
我创建了一个focused
属性来将isFocused
属性绑定到指令范围(我本可以将它命名为focusOn
,但我想<input type="text" focus-on focus-on="isFocused" />
会很奇怪})。
Here's您更新的jsFiddle。
更新:我将属性名称从ng-model
更改为focused
,因此更有意义。