2013-12-12 2 views
6

이 예제에서는 첨부 된 지시문이있는 입력이 있습니다. 이 지시문은 입력 옆에 메시지를 표시하기위한 것입니다. 다른 입력과 메시지를 추가하는 버튼이 있습니다. 일부 메시지가 표시되면 첨부 된 지시문을 사용하여 입력에 초점을 맞춰 메시지를 지워야합니다. http://jsfiddle.net/viro/WBqxf/

그래서 고립 된 모델로 지시문을 가지고 있으며, 지시어가있는 요소가 포커스를 맞추면 모델을 업데이트하려고합니다. 내가 범위에서 이벤트 콜백을 포장해야 할 것 같다 $ I 모델 업데이트 할 경우에 적용됩니다.

element.on('focus',function(){ 
    scope.$apply(function(){ 
     console.log("focus !"); 
     scope.tstMsg=[]; 
    }) 
}); 

나는 내가 jqlite 이벤트 콜백와 I를 사용하고 있기 때문에 적용 $ 그것을에서 포장이 있다고 가정을 "외부"angularJS를 실행한다고 생각하지만 문서에 명시되어 있지는 않습니다.

맞나요? 아니면 해킹입니까?

더 좋은 방법이 있습니까?

+0

은'ng-focus'를 사용하고 extrenal 이벤트 핸들러를위한 별도의 코딩을 저장하지 않습니다 http://docs.angularjs.org/api/ng.directive:ngFocus – charlietfl

+0

그러나 지시문이 연결된 모든 요소에 대해 동일한 동작을 원합니다 요소가있는 제어기에 관계없이 초점을 맞 춥니 다. ngFocus를 사용하면 모든 요소에 대해 메시지 배열을 재설정하는 함수를 만들 수 있습니다. 지시문에 의해 자동화 될 수 있다면 지루한 일입니다. 그렇지 않습니까? –

답변

2

scope. $ apply를 실행하면 $ digest가 실행되어 스코프의 모든 관찰자가 변경 사항을 확인하고 적절한 경우 실행합니다. 이 컨텍스트에서 $ apply를 적용하면 이벤트 (단지 addEventListener/attachEvent를 적절히 수행하는 것)에 바인딩하는 것입니다.

+0

element.on에서 바인딩 된 콜백은 "angularJS를 인식하지 못합니다"라는 의미입니다. 나는 그것에 대해 확신하지 못했습니다. –

+0

그래, 단지 jqLite 또는 jQuery를 사용하고 있기 때문에 질문에서 말한 것처럼 (각도 코드의 컨텍스트 내에 있지 않음을 포함하면). $ http와 $ timeout과 같은 서비스는 자동으로 범위를가집니다. $ apply call – shaunhusain

+0

그래서 setTimeout 대신 $ timeout이 있습니다; element.on 대신에 사용해야하는 것이 있습니까? –

3

Thrid 파티 라이브러리를 사용하고 변경을 수행 할 때마다 $apply()을 호출하여 각도를 알려야합니다.

@charlietfl가 NG 초점도 쉽게 언급 한 바와 같이 :

CONTROLER

$scope.focus = function() { 
    // Do something 
} 

HTML

<input ng-model="inp" tst-msg="message" ng-focus="focus()" /> 

는 참조 jsFiddle

+0

$ 적용하지 않고 한 이유가있어 작동하지 않습니다. 나는 그것을 확인해야한다. 지시문을 자급 자족하기 때문에 ng-focus는 해결책이 아닙니다. 지시문을 첨부 한 입력이있는 모든 컨트롤러의 메시지를 재설정하는 함수를 코딩하지 않으려합니다. –

+0

jsFiddle (removed $ apply())를 업데이트하고 ng-focus를 추가했습니다. 봐. 나는 그것이 단지 나를 위해 일하는 것이 혼란 스러울 것이다. –

+1

나는 보았다. 실제로 작동합니다. 그러나 초점을 제거하면 그렇지 않습니다. 예를 들어 angularJS에 의해 처리되는 포커스가 $ digest cycle에 집중되므로 이벤트 콜백에서 이벤트를 처리 할 필요가 없습니다. ng-focus를 제거하려면 $ apply가 필요합니다. –