Angular $ scope. $ apply vs $ timeout as a safe $ apply
Angular에서 $ timeout 서비스를 일종의 "안전한 $ apply"방법으로 사용하는 것의 뉘앙스를 더 잘 이해하려고합니다. 기본적으로 Angular 이벤트 또는 jQuery 또는 일부 표준 DOM 이벤트와 같은 각도가 아닌 이벤트에 대한 응답으로 코드 조각이 실행될 수있는 시나리오에서.
내가 이해하는대로 :
- $ scope. $ apply의 코드 래핑은 다이제스트 루프 (일명 jQuery 이벤트)에 있지 않은 시나리오에서 잘 작동하지만 다이제스트가 진행중인 경우 오류가 발생합니다.
- 지연 매개 변수가없는 $ timeout () 호출의 코드 래핑은 이미 다이제스트주기에 있든 없든 작동합니다.
Angular 소스 코드를 보면 $ timeout이 $ rootScope. $ apply ()를 호출하는 것처럼 보입니다.
- 다이제스트주기가 이미 진행중인 경우 $ timeout ()도 오류를 발생시키지 않는 이유는 무엇입니까?
- 다이제스트가 이미 진행 중이 아니라고 확신 할 때 $ scope. $ apply ()를 사용하고 어느 쪽이든 안전해야 할 때 $ timeout ()을 사용하는 것이 가장 좋은 방법입니까?
- $ timeout ()은 정말 허용 가능한 "안전한 적용"입니까, 아니면 문제가 있습니까?
통찰력을 가져 주셔서 감사합니다.
Angular 소스 코드를 보면 $ timeout이 $ rootScope. $ apply ()를 호출하는 것처럼 보입니다.
- 다이제스트주기가 이미 진행중인 경우 $ timeout ()도 오류를 발생시키지 않는 이유는 무엇입니까?
$timeout
문서화되지 않은 Angular 서비스를 사용 $browser
합니다. 특히 항상 Angular 수명주기 밖에서 실행 $browser.defer()
되는를 통해 비동기식으로 함수 실행을 연기 하는 것을 사용 합니다 window.setTimeout(fn, delay)
. 한 번만 window.setTimeout
함수가 $timeout
호출 $rootScope.$apply()
됩니다.
- 다이제스트가 이미 진행 중이 아니라고 확신 할 때 $ scope. $ apply ()를 사용하고 어느 쪽이든 안전해야 할 때 $ timeout ()을 사용하는 것이 가장 좋은 방법입니까?
그렇게 말할 것입니다. 또 다른 사용 사례는 다이제스트 후에 만 초기화된다는 것을 알고있는 $ scope 변수에 액세스해야하는 경우가 있습니다. 간단한 예는 (어떤 이유로 든) 컨트롤러 생성자 내에서 폼의 상태를 더티로 설정하려는 경우입니다. $ timeout이 없으면 $ FormController
scope에 초기화 및 게시되지 않았으므로 $scope.yourform.setDirty()
$ timeout 내에서 래핑 하면 FormController
초기화되었습니다. 물론 $ timeout없이 지시문을 사용하여이 모든 작업을 수행 할 수 있으며 다른 사용 사례를 제공합니다.
- $ timeout ()은 정말 허용 가능한 "안전한 적용"입니까, 아니면 문제가 있습니까?
항상 안전해야하지만 go to 메서드는 항상 $ apply ()를 목표로해야합니다. 현재 작업중인 Angular 앱은 상당히 크고 $ apply () 대신 $ timeout에 한 번만 의존하면됩니다.
응용 프로그램에서 $ apply를 많이 사용하면 오류 : $ digest가 이미 진행 중입니다. 한 번에 하나의 $ digest주기를 실행할 수 있기 때문에 발생합니다. $ timeout 또는 $ evalAsync로 해결할 수 있습니다.
$ timeout은 "$ digest already in progress"와 같은 오류를 생성하지 않습니다. 왜냐하면 $ timeout은 Angular에게 현재 사이클 후에 대기 시간이 있다는 것을 알려주기 때문에 다이제스트 사이클 사이에 충돌이 발생하지 않고 $의 출력이 발생하지 않도록합니다. 타임 아웃은 새로운 $ digest주기에서 실행됩니다.
나는 그것들 을 apply, timeout, digest 및 evalAsync 비교 에서 설명하려고했습니다 .
도움이 될 수 있습니다.
내가 이해 $timeout
하는 한은 setTimeout
암시 적으로 호출 하는 래퍼입니다 $scope.$apply
. 즉, 앵귤러 라이프 사이클 외부에서 실행되지만 앵귤러 라이프 사이클 자체를 시작합니다. 은 "잡았다"나는 생각할 수있는 당신이 당신의 결과를 사용할 수를 기대하는 경우이다 이 $digest
, 당신이 (AFAIK를 통해에서만 사용할 수 있습니다, "안전한 적용"에 다른 방법을 찾을 필요 $scope.$$phase
).
참고 URL : https://stackoverflow.com/questions/23070822/angular-scope-apply-vs-timeout-as-a-safe-apply
'IT Share you' 카테고리의 다른 글
RESTful API에서 객체 계층을 어떻게 처리해야합니까? (0) | 2020.11.08 |
---|---|
계층 적 데이터를 저장하는 데 가장 적합한 NoSQL 데이터베이스 유형은 무엇입니까? (0) | 2020.11.08 |
Android 에뮬레이터 : qemu-system-i386.exe : goldfish_battery_read : 잘못된 오프셋 (0) | 2020.11.08 |
다른 가변 함수에 줄임표 전달 (0) | 2020.11.08 |
Apache RewriteRule 지시문에서 환경 변수를 설정할 때 변수 이름 앞에 "REDIRECT_"가 붙는 이유는 무엇입니까? (0) | 2020.11.08 |