prosource

ng-repeat 함수에 의해 반환된 아이템을 루프하려면 어떻게 해야 합니까?

probook 2023. 2. 27. 22:27
반응형

ng-repeat 함수에 의해 반환된 아이템을 루프하려면 어떻게 해야 합니까?

div를 반복적으로 만들고 싶은데, 항목은 함수에 의해 반환되는 객체입니다.단, 코드리포트 오류는 10$digest() 반복에 도달했습니다.중단합니다! jsfiddle은 http://jsfiddle.net/BraveOstrich/awnqm/에 있습니다.http://jsfiddle.net/BraveOstrich/awnqm/

<body ng-app>
  <div ng-repeat="entity in getEntities()">
    Hello {{entity.id}}!
  </div>
</body>

간단한 답변: 이러한 기능이 정말 필요합니까, 아니면 자산을 사용할 수 있습니까?http://jsfiddle.net/awnqm/1/

장답

알기 쉽게 하기 위해 ngRepeat는 오브젝트 배열에 대해서만 설명합니다.그리고 몇 가지 세부 사항은 생략하겠습니다.

AngularJS는 변경 검출에 더티 체크를 사용합니다.응용 프로그램이 시작되면 에 대해 실행됩니다.$digest는 스코프의 계층에 대해 깊이 우선 트래버설을 수행합니다.모든 스코프에는 시계 목록이 있습니다.각 워치는 마지막 값을 가집니다(처음에는).initWatchVal 워치의 각에 대해서)는 「 」입니다.$digest값을 (실행합니다).watch.get(scope)합니다.watch.last현재 값이 다음 값이 아닌 경우watch.last 첫 ) ('최초 비교용)$digestdirty로로 합니다.true dirty == true $digest에서 다른 깊이 우선 트래버설을 시작합니다.$rootScope$digest==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜 ==가짜.'10 $sec() 레퍼런스에 도달했습니다."가 기록됩니다.

에에에 대해서ngRepeat.watch.get값를합니다.getEntities추가 정보가 HashQueueMap캐시에 저장됨( by)hashKey)의 경우)에 대하여watch.getngRepeat 하다hashKey캐시하지 않는 경우는, 「 ngRepeat캐시 저장, 새 범위 생성, 객체 배치, DOM 요소 생성

에 대해서.보통hashKey에 의해 생성된 고유 번호입니다.단, 함수일 수도 있습니다. hashKey나중에 사용하기 위해 생성한 후 객체에 저장됩니다.

이 예에서 오류가 발생하는 이유: 함수getEntities()는 항상 새 개체와 함께 배열을 반환합니다.「」가 .hashKey에 and and and and and and and and 。ngRepeat, '캐시', '캐시'ngRepeatwatch.get는 새로운 워치를 합니다.{{entity.id}}는 먼저 watch.get 있다watch.last == initWatchValwatch.get() != watch.last$digest을 사용하다 ★★★★★★★★★★★★★★★★★.ngRepeat새 워치를 사용하여 새 스코프를 만듭니다.10월 10살

수정 방법

  1. 에 를 만들지 .getEntities()discl.discl.discl을 클릭합니다.
  2. 할 추가해도 .hashKey방법을 가르쳐 주세요.예에 대해서는, 이 토픽을 참조해 주세요.

Angular를 아는 사람들은JS 내부에서는 내가 틀리면 고쳐줄 거야.

반복 범위를 벗어나 어레이를 초기화합니다.

<body ng-app>
   <div ng-init="entities = getEntities()">
       <div ng-repeat="entity in entities">
           Hello {{entity.id}}!
       </div>
   </div>
</body>

이 내용은 여기에서 보고되었으며 다음과 같은 답변을 받았습니다.

getter는 유휴 상태가 아니며 모델을 변경합니다(호출될 때마다 새 배열을 생성).이로 인해 모형이 안정되기를 바라며 앵글을 계속 호출하게 되지만 앵글은 절대 포기하지 않고 예외를 발생시킵니다.

getter return 값은 동일하지만 동일하지 않은 것이 문제입니다.

메인 컨트롤러 외부로 어레이를 이동하면, 이 동작이 없어지는 것을 알 수 있습니다.

var array = [{id:'angularjs'}];
function Main($scope) {
    $scope.getEntities = function(){return array;};
};

매번 같은 오브젝트를 반환하고 있기 때문입니다.함수 대신 스코프의 속성을 사용하도록 모델을 재설계해야 할 수 있습니다.

컨트롤러의 메서드 결과를 속성에 할당하고 ng:repeat을 실행하여 대처했습니다.

@przno 코멘트 기준

<body ng-app>
  <div ng-repeat="item in t = angular.equals(t, getEntities()) ? t : getEntities()">
    Hello {{item.id}}!
  </div>
</body>

BTW second solution @Artem Andreev는 Angular 1.1.4 이상에서는 동작하지 않는 반면 첫 번째 솔루션으로는 문제가 해결되지 않는다고 말합니다.현재로선 이 솔루션이 기능면에서 단점이 없는 덜 뾰족한 솔루션이라고 생각합니다.

언급URL : https://stackoverflow.com/questions/12336897/how-to-loop-through-items-returned-by-a-function-with-ng-repeat

반응형