2013-06-18 4 views
26

범위에 함수를 정의했습니다. 그리고 {{}} 내부의 뷰에서 호출하면 X 번 반복됩니다.각도 범위 함수가 여러 번 실행되었습니다.

컨트롤러

function testCtrl($scope) { 
    $scope.myFunc = function(name) { 
     return "Hello " + name; 
    } 
} 

HTML

<div>{{myFunc('Joe')}}</div> 

당신이 예에서 볼 수 있습니다 http://jsfiddle.net/rbRvD/2/

또는 Plunker과 : http://plnkr.co/edit/LLQ7cKs2fEoBwv0C5XPE

난이 잘못된 방향으로 이루어집니다 생각 그런데 왜 여러 번 실행됩니까?

+0

플 런커를 설정하십시오. – Stewie

+0

플 런커 링크로 업데이트 – hesa

+0

이 문제를 어떻게 정확히 건너 뛸 수 있습니까? – user2099451

답변

26

귀하의 기능은 10 회 실행됩니다. 왜 10? 왜 안 되니?

대답 is in the docs :

시계 리스너가 발광 할 다른 청취자를 트리거 할 수있는 모델을 변경할 수 있습니다. 이는 변경 사항이 감지 될 때까지 감시자를 다시 실행하여 수행됩니다. 다시 실행 반복 제한 은 무한 루프 교착 상태를 방지하기 위해 10입니다.

이 메시지가 나타나면 Angular가 다이제스트를 다시 실행하고 시계를 다시 실행해야한다는 의미로 모델을 변경하고 있음을 의미합니다. 특별한 경우에 페이지에 표시된 카운터를 업데이트하는 함수를 호출하고 있습니다. 카운터 값이 변경되면 카운터 등을 업데이트하는 함수를 호출하는 다이제스트가 다시 실행됩니다.

Angular는 모델을 변경하고 뷰가 해당 변경 사항에 응답하도록하고 (실제로 권장합니다) 다른 방향보다는 오히려.

+0

답변 해 주셔서 감사합니다. – hesa

+0

내 응답에서이 부분을 놓친 ... 좋아, 그럼 문제가 아니 겠지? 이 카운터는 더 명확하게 해주는 예일뿐입니다. 로그로 각 감시자에 대해 한 번 기록했을 것입니다. – hesa

10

이것은 예상되는 동작입니다. 각도 표현 ({{expression}})은 각 $digest loop (때로는 루프 당 여러 번)에서 다시 계산됩니다. 이것은 표현이 계산 용어로 가벼워 져야 함을 의미합니다.

그렇다면 표현식 평가로 인해 AJAX 호출이나 다른 집중적 인 또는 비동기식 연산이 발생하지 않아야합니다. 그렇지 않은 경우 결과를 캐싱해야합니다.

+0

zetetic의 대답은 기술적으로 정확하지만 여기에 게시 된 질문이 아니라 plunkr에 응답합니다 (다른 내용). 이 답변은 여기에 게시 된 질문에 대한 것입니다. – Sacho

1

AngularJs는 렌더링시 범위 모델을 변경하라는 제안을하지 않습니다. 범위 모델을 변경하려면 컨트롤러 또는 지시문에서 수행하십시오.

보기를 데이터 (이 경우 범위 값) 만 표시하는 위치로 생각하면 데이터 수정은 모두 컨트롤러 또는 지시문에 있어야합니다.

+0

당신이 카운터 값을 의미하는 경우에만 거기에 내 예제를 명확하게.대신에 로그를 기록 할 수 있습니다. – hesa

관련 문제