3

AngularJS에서 내 방식을 꼼짝 않고 바라보고 있습니다.AngularJS 범위 변수가 사용자 지정 지시문에서 평가할 때까지 기다립니다.

나는 정의 지시어 만들었습니다

app.directive('myScroll',function(){ 
return { 
    restrict: 'A', 
    transclude: true, 

    template: '<div ng-transclude></div>', 
    link: function(scope , element , attrs) { 

    element.addClass('scroll-pane'); 

    scope.$watch('tasks', function(newval, oldval){ 
      if (newval ) 
      { 

      console.log(newval); 
      console.log(newval.length); 
     } 

    }); 

     console.log("afer watch exper"); 
     console.log (tasks); 



    } 


    }; 

을}); 다음 HTML과

: (내가 그 코드를 게시 할 예정입니다 필요한 경우) 작업 컨트롤러에 의해라는 서비스를 통해 평가 객체

<div my-scroll> 
     <ul> 
      <li data-ng-repeat="task in tasks" class="task-wrapper"> 
       <div class="task-element"> 
        <div class="name">{{task.name}}</div> 
        <div class="text">{{task.action}}</div> 
       </div> 
      </li> 
     </ul> 
    </div> 

.

지시어 코드에서 작업 객체가 정의되지 않았습니다. 작업 길이가 더 많은 CSS 명령을 실행해야하므로 ng-repeat가 끝날 때까지 기다리거나 작업 변수가 평가 될 때까지 기다려야합니다.

작업은 $ watch 문 외부와 내부에서 항상 정의되지 않습니다. 콘솔에서 "watch exper 후"가 먼저 표시되고 "in watch"가 표시되지만 여전히 값이 표시되지 않습니다. newval 객체에는 [move2 : function]이 있지만 길이 속성은 0을 계속 유지하지만 작업에 대한 리소스 배열을 유지합니다.

여기에 무엇이 누락되어 있으며 작업 변수를 계산할 때 명령을 어떻게 실행할 수 있습니까?

도우미에게 감사드립니다.

답변

11

데이터를 참조하려면 scope.tasks을 사용해야합니다.

app = angular.module('myApp', []); 
app.directive('myScroll', function() { 
    return { 
     restrict: 'A', 
     transclude: true, 

     template: '<div ng-transclude></div>', 
     link: function (scope, element, attrs) { 

      element.addClass('scroll-pane'); 

      scope.$watch('tasks', function (newval, oldval) { 
       if (newval) { 
        console.log(newval); 
        console.log(newval.length); 
       } 
      }); 
      console.log("afer watch exper"); 
      console.log(scope.tasks); //this will log the actual data. 
     } 
    }; 
}); 

function Ctrl($scope) { 
    $scope.tasks = [{ 
     name: "task1", 
     action: "action1" 
    }] 
} 
+0

감사합니다! 나 한테 바보 같은 실수 ... 나는 조금 더 질문이있다, 나는 시계식이 두 번 호출되는 것을 볼 수있다, 왜? db에 대한 asyc 서비스 호출 때문에? – RonenIL

5

3 매개 변수 전달 시도 - 볼 $에 사실을 :

scope.$watch('tasks', function(newval, oldval){ 
    if(newval){ 
     console.log(newval); 
     console.log(newval.length); 
    } 
},true); 
+0

이것은 나를 위해 일했고, 문서에서 나는 '참'힘을 비교하여 참조 대신 객체 평등을 비교하는 것을 본다. 왜 이것이 여기에 필요한지 아십니까? – thebenedict

+1

세 번째 매개 변수로 true를 전달하면 angular가보고있는 모델의 전체 복사본을 만듭니다. 또한 "나중에 비교할 수 있도록 개체의 값을 저장하려면 angular.copy 함수가 사용되며 복잡한 옵션을 보는 것은 불리한 메모리와 성능에 영향을 미친다는 것을 의미합니다." 거대한 물건을 감시하는 것은 좋은 생각이 아닙니다. – AlwaysALearner

+0

나는이 차이를 보여주기 위해 플 런커를 만들었으므로 몇 번이나 붙어있다. http://plnkr.co/edit/DHJPwMOg4LZTSk1uiV9z?p=preview – thebenedict

관련 문제