2013-08-11 1 views
0

jsFiddle here

후 발사하지 관찰의 <input>가 올바르게에 집중됩니다 것을 알 수 있습니다. 후속 클릭에서 초점이 더 이상 설정되지 않습니다.

나는 submit()isFocused 변경할 때 $observe 콜백이 트리거 점점되지 않은 것으로 나타났습니다, 그래서 명시 적으로 변수를 재설정하는 blur 리스너를 추가하지만 그 중 하나가 도움이되지 않았다.

제출시 포커스 스틱을 어떻게 만듭니 까?

: Final working fiddle을 편집하십시오. $watch 대신 임의의 표현식을 사용하려고합니다.

답변

2

요소를 보면 얼룩 콜백이 실행될 때 focus-on 속성이 false로 설정되어 있지 않음을 알 수 있습니다. 그 이유는 blur 함수가 각도의 범위를 벗어나므로 내부에서 변경 한 사항을 인식하지 못하기 때문입니다.

는 내가 형태로 실제 값을 나타 내기 위해 NG 모델을 필요로하기 때문에 이것에 대해 $apply

element.bind('blur', function() { 
    scope.$apply(function() { 
     scope.isFocused = false; 
     console.log('blur'); 
    }); 
}); 

http://jsfiddle.net/6vfGm/7/

+0

D' oh. 나는이 $ 적용 물건을 잘 알고 있었지만, 나는 다른 것들을 시험해 보면서 그것을 간과했다. 감사! – thatmarvin

+0

+1, 잘 발견되었습니다. 나는 아직도이 $ 관측 방법이 최선인지 모르겠다. $ broadcast/$ on은 짧고 유지 보수가 쉬운 코드에서 같은 결과를 얻는다.나는 내가 실종 된 이유가 있다면 확신 할 수 열려 있습니다! – mikel

+0

@mikel 실제로 http://stackoverflow.com/a/14205885/457519에서 $ observe를 훔쳤지 만 대신 $ watch를 사용하여 최종 해결책을보십시오 : http://jsfiddle.net/thatmarvin/e9H5x/. 불일치 이벤트 문자열로 인해 자동으로 실패 할 때 여러 인스턴스가 실행 되었기 때문에 이벤트를 사용하지 않는 것이 좋습니다. 적어도 변수가 정의되지 않은 경우 오류가 표시됩니다. 게다가 빈 필드를 제출하는 것 외에도 필드에 집중해야하는 이유가 있기 때문에 이벤트 문자열을 하드 코딩하고 싶지 않습니다. 그냥 여기에 이벤트를 적절히 사용하는 것처럼 보이지 않습니다. – thatmarvin

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> 

자바 스크립트

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'); 
    }; 
}); 

에게 내가 지시 범위에 isFocused 속성을 결합하는 focused 속성을 생성 (내가 가질 수 이름은입니다.,하지만 이상한 것 같아 <input type="text" focus-on focus-on="isFocused" />).

Here's 업데이트 된 jsFiddle

업데이트 : 속성 이름을 ng-model에서 focused으로 변경 했으므로 더 적절합니다.

+0

확실하지에 전화 내부에 변화를 감싸 필요로하는 변화의 각도 인식을 만들려면 들. ng-model = 'email'이라고 말하면 $ scope.email = true를 사용하는 것은 의미가 없습니다. – thatmarvin

+0

아, 알겠습니다. 음, 속성의 다른 이름을 선택할 수 있습니다. –

+0

방금 ​​속성 이름을'focused'로 변경했습니다. 지금 더 의미가 있습니다. –

관련 문제