2015-01-22 1 views
0

이전 경로의 컨트롤러의 기능 (예 : /items를) 평가를 다시하고 컨트롤러가 표시 템플릿에 사용되는변경 노선 내가 경로를 가지고

$scope.pathForItem = function (item) {...} 

방법을 가지고 있습니다 목록의 각 항목에 대한 경로 이 페이지에서 링크를 클릭하여 경로를 변경하면 각도 코드가 $rootScope.$apply() 어딘가에서 호출되어 $scope에 정의 된 일부 기능을 다시 평가하게됩니다. 문제는 이전 경로 컨트롤러의 범위에서 함수를 다시 평가하므로 페이지의 모든 항목에 대해 한 번만 pathForItem을 호출한다는 것입니다. 대개 큰 문제는 아니지만 불필요하지만 오류는 발생하지 않습니다.

그러나 로그 아웃하려고하면 오류가 발생합니다. pathForItemuser 개체가 존재한다고 가정하고 (이 주소는 authService에서 발생) 일반적으로이 경로의 resolve 함수에 사용자가 있는지 확인하기 때문에 작동합니다. 이제 로그 아웃하려고하면 Angular는 $rootScope.$apply()으로 전화를 걸어 모든 항목에 대해 pathForItem 번으로 다시 전화를 시도합니다. 그러나 어딘가에 중간에, 사용자가 마지막으로 제거됩니다, authService.currentUser()null를 반환 시작하고 pathForItem 인상 오류에 대한 모든 추가 호출 ...

그것이 정말 그런 일을해야 하는가? Angular의 $rootScope.$apply은 이전 경로의 컨트롤러에도 기능을 호출해야합니까? 일반적인 해결 방법이 있습니까? 아니면 템플릿에 사용되는 모든 컨트롤러의 모든 기능이 항상 resolve 함수에서 검사 했는데도 실제로 사용하는 모든 개체가 실제로 있는지 확인해야합니까?

저는 Angular 1.3.10을 ngRoute와 함께 사용하고 있습니다.

+0

'$ apply'는 경로에 대해 아무것도 모릅니다. 어떻게해야합니까? 차라리 모든 다이제스트주기 중에 함수가 호출된다는 점을 염두에 두어야합니다. 그것은 특별히 생각하지 않습니다. – zeroflagL

+0

잘 피하기가 어렵습니다. 예를 들면 다음과 같습니다. http://plnkr.co/edit/B4sH8bZhRJmRdTP4UWGt?p=preview "두 번째"링크를 클릭하면 Angular는 여전히 "first()"를 호출하여 콘솔 출력을 확인합니다. 또한, 왜 3 번이나 부르는 지 모르겠지만 또 다른 문제입니다. – szimek

+1

이상적으로'pathForItem'은 값이 아니라 함수입니다.물론 당신의 상황을 모르겠다. 그러나 나는'pathForItem'의 리턴 값이 매 다이제스트주기마다 변하지 않는다고 생각한다. 나는 그것이 로그인 한 사용자에 달려 있다는 인상을 받았는데, 이는 값이 전혀 변하지 않는다는 것을 의미합니다. – zeroflagL

답변

1

(보간 -) 표현식의 함수가 모든 다이제스트주기 중에 호출되므로이 문제가 발생할 때 미리 알 수 없습니다. 따라서 함수는 더 자주 자주 호출 될뿐만 아니라 예상치 못한 시간에 호출 될 수 있도록 준비되어야합니다.

사례의 원인은 html5 모드입니다. 링크를 다시 쓰고 $apply을 호출하는 전역 이벤트 처리기가 있습니다. 문제는 html5 모드가 활성화되어 있지 않아도 완료된다는 것입니다. 나는이 문서가

이 html5Mode가 를 사용하는 경우라고 때문에이에게 버그를 고려, 당신은 config 블록에서이 동작을 해제 할 수 있습니다, /이

어쨌든 상대 링크

에 대한 URL 재 작성을 비활성화 할 수 있습니다 :

$locationProvider.html5Mode({rewriteLinks: false}); 

자세한 내용은 docs을 참조하십시오. 이 문제가 필요한 경우 상황에 맞게 함수를 준비하거나 $scope.pathForItem 값을 설정하십시오. 나는 후자를 어쨌든 추천한다.

+0

고마워요. 'pathForItem'은 각 아이템마다 다른 값을 반환하므로 일회성 바인딩을 사용하는 것이 더 낫다고 생각합니다. 이것은 items 배열이 수정되었을 때도 쉽게 처리해야합니다. – szimek