programing

$$단계는 AngularJS로 무엇입니까?

linuxpc 2023. 2. 25. 19:50
반응형

$$단계는 AngularJS로 무엇입니까?

누군가 부트스트랩 모달에 쓴 각도 지시문의 일부인 코드 조각을 찾았어요

//Update the visible value when the dialog is closed                                                                                                                                                                                                            
                //through UI actions (Ok, cancel, etc.)                                                                                                                                                                                                                         
                element.bind("hide.bs.modal", function () {                                                                                                                                                                                                                     
                    scope.modalVisible = false;                                                                                                                                                                                                                                 
                    if (!scope.$$phase && !scope.$root.$$phase)                                                                                                                                                                                                                 
                        scope.$apply();                                                                                                                                                                                                                                         
                });  

이 부분은 hide.bs.modal 이벤트에 바인드하고 UI가 변경되면 modal을 업데이트 하는 양방향 바인딩의 후반부를 위한 것으로 알고 있습니다.

왜 $$단계에서 범위와 rootScope를 체크한 후 Apply를 호출하는지 알고 싶습니다.

지금 바로 신청하면 안 되나요?

여기서 $$단계는 무엇입니까?

많이 찾아봤지만 좋은 설명을 찾을 수가 없었어요.

편집:

예시를 본 곳은 다음과 같습니다. 부트스트랩모달의 심플 앵귤러 디렉티브

$$phase가 angular 일 때 입니다.$digestcycle. cycle cycle cycle cycle cycle cycle cycle cycle cycle cycle.

( 체크하고 가 있어요.$$phase하기 $apply을 오류가 발생합니다.$apply a $digest:

오류: $apply가 이미 진행 중입니다.

다이제스트 사이클 중에 각이 지는 깃발이라는 게 데이빈 말이 맞아요.

하지만 코드에 사용하지 마세요.

최근에 Misko(각도 작성자)에게 $$ 단계에 대해 물어봤더니, 그는 절대 사용하지 말라고 했다. 다이제스트 사이클의 내부 구현이기 때문에 미래에 안전하지 않다.

향후에도 코드가 계속 기능하도록 하기 위해, 그는 $타임아웃 기간 내에 "안전한 적용"을 원하는 모든 것을 포장할 것을 제안했습니다.

$timeout(function() {
  // anything you want can go here and will safely be run on the next digest.
})

콜백 등의 다이제스트 사이클 중에 해결할 수 있는 일이 있을 때 자주 발생합니다(다만, 항상 그렇지는 않습니다).

다음은 제가 구글 라이브러리 중 하나를 다룰 때의 일례입니다. (이 서비스가 제공되었던 나머지 서비스는 중단되었습니다.

window.gapi.client.load('oauth2', 'v2', function() {
    var request = window.gapi.client.oauth2.userinfo.get();
    request.execute(function(response) {
        // This happens outside of angular land, so wrap it in a timeout 
        // with an implied apply and blammo, we're in action.
        $timeout(function() {
            if(typeof(response['error']) !== 'undefined'){
                // If the google api sent us an error, reject the promise.
                deferred.reject(response);
            }else{
                // Resolve the promise with the whole response if ok.
                deferred.resolve(response);
            }
        });
    });
});

$timeout의 delay 인수는 옵션이며 설정되지 않은 상태로 두면 기본값0이 됩니다(지연이 설정되어 있지 않으면 기본값이 0이 됩니다).

조금 직감적이지 않지만, Angular라는 글쓴이의 답변이니까, 난 그걸로 충분해!

이 예에서는 요소 바인딩이 비각형 이벤트에서 실행됩니다.합니다.$apply()위상을 체크하지 않고.

를 보면, 「 」라고 하는 이 있습니다.$scope function함수라고 하는 showModal()이 함수는 "hide.bs.modal" 이벤트가 발생할 수 있는 비모듈 코드를 호출합니다.통해 가 발생했을 은 '1'에 있습니다.$digest

따라서 이 이벤트는 각도 관리 코드와 비 각도 코드 모두에서 호출되는 함수의 드문 경우에 해당됩니다.$$phase이 경우 이벤트가 어떻게 발생했는지 모르기 때문에 필요합니다. 경우,$$phase되고 다이제스트 루프가 됩니다.$apply()호출할 필요가 없습니다.

이 패턴을 「안전 적용」이라고 부릅니다.

스코프를 소화할 때나 적용할 때 사용하는 것이 좋은 것으로 알고 있습니다.truthy일 경우 현재 $digest 또는 $apply 단계가 진행 중임을 의미합니다.관련 오류가 발생할 경우 $scope를 실행할 수 있습니다.$$phase | $diag.diag(); $diages가 다이제스트 되는 것은 $diages뿐입니다.$pahse는 가짜입니다.

하시면 됩니다.$scope.$evalAsync() 합니다.$scope.$apply()$$phase는 @substorbust에 의해 됩니다.

최근에 Misko(각도 작성자)에게 $$ 단계에 대해 물어봤더니, 그는 절대 사용하지 말라고 했다. 다이제스트 사이클의 내부 구현이기 때문에 미래에 안전하지 않다.

★★★★★의 $scope.$evalAsync()원하는 것을 얻을 수 있고, 다이제스트 사이클에 따라 새로운 데이터를 얻을 수 있습니다.이것에 의해, $120보다 고속으로 얻을 수 있습니다.

지금까지 delferred-$digest-incallation에 대한 접근법은 $scope를 대체하는 것이었습니다.$delay() 서비스(지연 후 암묵적으로 $delay()를 호출함)를 사용하여 $delay()를 호출합니다.하지만 어제 $scope를 발견했어요.$evalAsync() 메서드.이 두 가지 모두 동일한 작업을 수행합니다. 즉, 표현식 평가를 이후 시점까지 연기합니다.하지만, $scope.$evalAsync()는 JavaScript 이벤트루프와 같은 틱으로 실행될 가능성이 있습니다.

사용법은 매우 간단합니다.

$scope.$evalAsync(
    function() {
       // Call some method here OR 
       $scope.excutemyMethod(); 

       // assign some value;
       $scope.someVariable = "asd"

    }
);

「 」의 .$evalAsync()비동기 큐에 추가되므로 내부 트리거링에 의해 다음 다이제스트사이클에서 실행할 수 있습니다.

, 「」도 포함되어 있습니다.$timeout비동기 큐의 길이를 감시하고 비동기 큐의 작업을 대기하여 가능한 한 빨리 기능을 실행 사이클에 넣기 위한 드문 시나리오를 처리하기 위한 콜입니다.이 사실을 설명하는 Ben Nadel 블로그를 참조하십시오.

언급URL : https://stackoverflow.com/questions/20263118/what-is-phase-in-angularjs

반응형