codememo

각도 $scope.안전한 $190 대 $190

tipmemo 2023. 2. 22. 21:56
반응형

각도 $scope.안전한 $190 대 $190

저는 Angular의 $timeout 서비스를 "안전한 $apply" 방법으로 사용하는 것의 차이를 더 잘 이해하려고 합니다.기본적으로 Angular 이벤트 또는 jQuery와 같은 비각 이벤트 또는 일부 표준 DOM 이벤트에 대한 응답으로 코드가 실행될 수 있는 시나리오입니다.

내가 아는 바로는:

  1. 포장 코드는 $scope입니다.$apply는 다이제스트 루프(jQuery 이벤트라고도 함)가 아닌 시나리오에서는 정상적으로 동작하지만 다이제스트가 진행 중일 경우 오류가 발생합니다.
  2. 지연 파라미터를 사용하지 않고 $timeout() 호출로 코드를 랩핑하면 다이제스트 사이클에 이미 들어가 있는지 여부에 관계없이 동작합니다.

Angular 소스 코드를 보면 $timeout이 $rootScope에 호출하는 것처럼 보입니다.145달러

  1. 다이제스트 사이클이 이미 진행 중인 경우 $timeout()도 오류를 발생시키지 않는 이유는 무엇입니까?
  2. $scope를 사용하는 것이 베스트 프랙티스입니다.다이제스트가 아직 진행 중이 아닌 것을 확실히 알고 있는 경우는 $digest()이며, 어느 쪽이든 안전이 필요한 경우는 $digest()입니까?
  3. $timeout()은 정말 허용 가능한 "안전 적용"인가요, 아니면 gotcha가 있나요?

통찰해 주셔서 감사합니다.

Angular 소스 코드를 보면 $timeout이 $rootScope에 호출하는 것처럼 보입니다.145달러

  • 다이제스트 사이클이 이미 진행 중인 경우 $timeout()도 오류를 발생시키지 않는 이유는 무엇입니까?

$timeout되어 있지 않은 서비스를 합니다.$browser으로 말하면, 「 」를 사용하고 있습니다$browser.defer()시키는 데 됩니다.window.setTimeout(fn, delay)각이 지다만 ★★★★window.setTimeout(기능이 정지되었습니다)이 ★★★★★★★★★★★★★★★★★★★★★★」$timeout$rootScope.$apply().

  • $scope를 사용하는 것이 베스트 프랙티스입니다.다이제스트가 아직 진행 중이 아닌 것을 확실히 알고 있는 경우는 $digest()이며, 어느 쪽이든 안전이 필요한 경우는 $digest()입니까?

난 그렇게 말했을 거야.또 다른 사용 사례는 다이제스트 후에만 초기화된다는 것을 알고 있는 $scope 변수에 액세스해야 하는 경우가 있습니다.간단한 예로는 컨트롤러 컨스트럭터 내부에서 폼 상태를 더티로 설정하는 경우가 있습니다(어떤 이유로든).을 사용하지 $timeout이 됩니다.FormController$140으로되지 않았기 에 $140으로 .$scope.yourform.setDirty()은 $140을 합니다.FormController가 초기화되었습니다.$timeout 없이 지침으로 이 모든 작업을 수행할 수 있습니다. 다른 사용 사례만 제시하면 됩니다.

  • $timeout()은 정말 허용 가능한 "안전 적용"인가요, 아니면 gotcha가 있나요?

항상 안전하지만, 항상 $apply()를 목표로 해야 한다고 생각합니다.현재 작업 중인 Angular 앱은 상당히 크기 때문에 $apply()가 아닌 $timeout에 한 번만 의존하면 됩니다.

응용 프로그램에서 $apply를 많이 사용하면 오류: $digest가 이미 진행 중입니다.이는 한 번에 $digest 사이클을 하나씩 실행할 수 있기 때문입니다.$timeout 또는 $evalAsync로 해결할 수 있습니다.

$timeout은 "$digest already in progress"와 같은 오류를 생성하지 않습니다.$timeout은 Angular에게 현재 사이클 이후에 타임아웃이 발생하므로 다이제스트 사이클 간에 충돌이 발생하지 않으므로 새로운 $digest 사이클에서 $timeout 출력이 실행됩니다.

apply, timeout, digestevalAsync 비교에서 설명하려고 했습니다.

아마 도움이 될 거야.

제가 알기론$timeout에 싸여 있다setTimeout암묵적으로 호출하는 것은$scope.$apply즉, 각도 라이프 사이클을 벗어나지만 각도 라이프 사이클 자체를 킥스타트합니다.내가 생각할 수 있는 유일한 "알았다"는 것은 만약 당신이 결과를 얻을 수 있기를 바란다면 $digest, 「안전한 적용」을 위한 다른 방법을 찾을 필요가 있습니다(AFIK는 다음 사이트에서만 이용 가능).$scope.$$phase).

언급URL : https://stackoverflow.com/questions/23070822/angular-scope-apply-vs-timeout-as-a-safe-apply

반응형