我知道这个问题已经被问了大约 100 次(相信我,我已经全部阅读了),但是当指令不使用隔离范围时,我无法将焦点转到输入框。后备数据更改时,scope.$watch 不会触发。
你问,为什么不只使用具有隔离作用域的那个?好吧,我的理解是,如果你的指令有模板,你应该只使用隔离范围。
指令的唯一区别是:
// works
app.directive('doesFocus', function ($timeout) {
return {
scope: { trigger: '@doesFocus' },
link: function (scope, element) {
scope.$watch('trigger', function (value) {
// sets focus
}
...
// does not work, and in fact when I inspect attrs.doesNotFocus it is undefined
app.directive('doesNotFocus', function ($timeout) {
return {
scope: false,
link: function (scope, element, attrs) {
scope.$watch(attrs.doesNotFocus, function (value) {
// sets focus
}
...
我在使用 Angular 的第 3 周,所以我一定错过了一些愚蠢的语义问题。
这是一个说明我的问题的小提琴。 http://jsfiddle.net/tpeiffer/eAFmJ/
编辑
我的实际问题是我的真实代码是这样的(模拟问题的危险,你有时会掩盖真正的问题):
<input should-focus="{{isDrawerOpen()}" ... ></input>
但因为我使用的是函数,而不是属性,所以我错过了所需的刻度
<input should-focus="{{'isDrawerOpen()'}}" ... ></input>
进行此更改解决了问题,我的指令仍然可以是这样的:
scope.$watch(attrs.shouldFocus, focusCallback(newValue));
结束编辑
感谢您帮助我追求卓越的角度!
萨德