[angularjs] AngularJS 실행 컨트롤러를 두 번 결합

AngularJS는 $watch이벤트 와 같은 모델 코드를 두 번, 때로는 모델 상태를 지속적으로 확인하는 등 두 번 실행합니다 .

그러나 내 코드 :

function MyController($scope, User, local) {

var $scope.User = local.get(); // Get locally save user data

User.get({ id: $scope.User._id.$oid }, function(user) {
  $scope.User = new User(user);
  local.save($scope.User);
});

//...

내 DB에 2 개의 레코드를 삽입하여 두 번 실행됩니다. 나는 이것에 대해 오랫동안 머리를 두드리면서 분명히 배우고 있습니다!



답변

앱 라우터는 다음 MyController과 같이 탐색을 지정했습니다 .

$routeProvider.when('/',
                   { templateUrl: 'pages/home.html',
                     controller: MyController });

그러나 나는 또한 이것을 가지고 있었다 home.html:

<div data-ng-controller="MyController">

이것은 컨트롤러를 두 번 소화했습니다. data-ng-controllerHTML 에서 속성을 제거하면 문제가 해결되었습니다. 또는 controller:라우팅 지시문에서 속성을 제거했을 수 있습니다.

이 문제는 탭 탐색을 사용할 때도 나타납니다. 예를 들어, 다음 app.js을 포함 할 수 있습니다.

  .state('tab.reports', {
    url: '/reports',
    views: {
      'tab-reports': {
        templateUrl: 'templates/tab-reports.html',
        controller: 'ReportsCtrl'
      }
    }
  })

해당 보고서 탭 HTML은 다음과 유사 할 수 있습니다.

<ion-view view-title="Reports">
  <ion-content ng-controller="ReportsCtrl">

또한 컨트롤러를 두 번 실행합니다.


답변

AngularJS 문서-ngController
$ route 서비스를 통해 경로 정의에서 컨트롤러를 선언하여 DOM에 컨트롤러를 연결할 수도 있습니다. 일반적인 실수는 템플릿 자체에서 ng-controller를 사용하여 컨트롤러를 다시 선언하는 것입니다. 이로 인해 컨트롤러가 두 번 연결되고 실행됩니다.

ng-view지시문 과 함께 ngRoute를 사용 하면 컨트롤러는 기본적으로 해당 dom 요소에 연결됩니다 (또는 ui-router를 사용하는 경우 ui-view). 따라서 템플릿에 다시 첨부 할 필요가 없습니다.


답변

방금이 작업을 수행했지만 문제는 허용되는 답변과 다릅니다. 나는 이것을 내 미래의 자아를 위해 여기에 남겨두고 그것을 고치기 위해 밟은 단계를 포함시킵니다.

  1. 중복 컨트롤러 선언 제거
  2. 경로에서 슬래시 확인
  3. 확인 ng-ifs
  4. 불필요한 래핑 ng-view호출을 확인하십시오 (실수 ng-view로 래핑되어 실제로 실제 래핑되었습니다 ng-view. 컨트롤러에 세 번의 호출이 발생했습니다.)
  5. Rails를 사용하는 경우 파일 에서 turbolinksgem을 제거 해야 application.js합니다. 나는 그것을 발견하기 위해 하루 종일 낭비했다. 여기에 답변이 있습니다 .
  6. ng-app 및 부트 스트랩으로 앱을 두 번 초기화합니다. AngularJS 실행 컨트롤러를 두 번 결합
  7. 자체 컨트롤러를 정의하고 ng-click 등을 통해 템플릿에서이 컨트롤러의 콜백을 사용하는 지시문의 ‘링크’기능에서 전체 요소에 $ compile을 사용하는 경우 여기 에서 답변을 찾았 습니다 .

답변

컨트롤러가 두 번 초기화 할 수있는 경우를 하나 더 추가하고 싶습니다 (angular.js 1.3.1에 해당).

<div ng-if="loading">Loading...</div>
<div ng-if="!loading">
    <div ng-view></div>
</div>

이 경우 ng-view가 초기화 될 때 $ route.current가 이미 설정되어 있습니다. 이중 초기화가 발생합니다.

이 문제를 해결하려면 ng-if를 ng-show / ng-hide로 변경하면 모두 잘 작동합니다.


답변

참조를 위해 추가하고 싶습니다 :

페이지에서 실행되는 지시문에서 컨트롤러를 참조하여 이중 컨트롤러 코드 실행이 발생할 수도 있습니다.

예 :

return {

            restrict: 'A',
            controller: 'myController',
            link: function ($scope) { ....

HTML에 ng-controller = “myController”가있는 경우


답변

Angular 1.3 이상에서 angular-ui-router 를 사용할 때 경로 전환시 뷰를 두 번 렌더링 하는 데 문제가있었습니다 . 그 결과 컨트롤러도 두 번 실행되었습니다. 제안 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다.

그러나 angular-ui-router0.2.11에서 0.2.13으로 업데이트 하면 문제가 해결되었습니다.


답변

내 응용 프로그램 과이 문제에 대한 비트에 대한 모든 종속성을 찢어 버렸습니다 (자세한 내용 : AngularJS 앱이 두 번 시작됩니다 (일반적인 솔루션을 시도했습니다 ..) )

그리고 결국, 그것은 모두 Batarang Chrome 플러그인의 결함이었습니다.

에서 해결 이 답변 :

나는 누군가의 목록에서 가장 먼저 코드를 변경하기 전에 게시물마다 그것을 비활성화하는 것이 좋습니다.