0

我知道这个问题已经被问了大约 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));

结束编辑


感谢您帮助我追求卓越的角度!

萨德

4

2 回答 2

1

{{}}从您的 HTML 中删除。所以而不是:

<input class="filter-item" placeholder="Enter filter" 
 does-not-focus="{{bottomDrawerOpen}}" type="text">

利用

<input class="filter-item" placeholder="Enter filter" 
 does-not-focus="bottomDrawerOpen" type="text">

然后它适用于观看attrs.doesNotFocus

scope.$watch(attrs.doesNotFocus, function (value) {...} );

小提琴

于 2013-08-08T20:55:43.087 回答
0

您的底部抽屉正在查看功能isDrawerOpen(),而不是属性。
改变

   scope.$watch('isDrawerOpen()',...);

   scope.$watch('toggleBottomDrawer',...);
于 2013-08-08T18:40:37.220 回答