Helpex - Trao đổi & giúp đỡ Đăng nhập
7

Vì một số lý do, bộ điều khiển của tôi được gọi kép, khi tôi chuyển đổi giữa tài nguyên 1 và tài nguyên2.

Đây là mã:

index.html

<!DOCTYPE html>
<html ng-app="multiple_calls">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <link rel="stylesheet" href="style.css" />
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <a href="#res/1">1</a>
    <a href="#res/2">2</a>

    <div ng-view>
    </div>
  </body>

</html>

app.js

var app = angular.module('multiple_calls', []);

app.
  config(['$routeProvider', function($routeProvider) {
  $routeProvider.
      when('/res/:id', {templateUrl: 'res.html',
                        controller: 'res'
      });
}]);


app.controller('MainCtrl', function($scope) {
});

app.controller('res', function($scope, $routeParams) {
  console.log('resource called')
  $scope.id = $routeParams.id;
});

res.html

{{id}}

http://plnkr.co/edit/HsCJmbllOcnlvlc1oiHa?p=preview

Nếu bạn nhấp vào mục 1 rồi đến mục 2, bạn sẽ thấy "tài nguyên được gọi là" được in 3 lần: 2 lần cho mỗi lần thay đổi giữa các tài nguyên.

Bất kỳ manh mối tại sao điều này xảy ra?

7 hữu ích 0 bình luận 26k xem chia sẻ
14

Đã tìm thấy một câu hỏi chính xác:

AngularJs: controller được gọi hai lần bằng cách sử dụng $ routeProvider

Giải pháp là thêm "/" vào cuối url bộ định tuyến:

-      when('/res/:id',
+      when('/res/:id/',
14 hữu ích 1 bình luận chia sẻ
1

Điều này cũng hoạt động nếu bạn thay đổi sang phiên bản góc cạnh 1.1.5

1 hữu ích 0 bình luận chia sẻ
0

Tôi vẫn đang tìm hiểu về góc cạnh và tôi đã gặp sự cố này, khi tôi viết chỉ thị và bao gồm bộ điều khiển.

Tôi hy vọng sẽ giúp được ai đó vì tôi đã dành khá nhiều thời gian để xem những gì tôi đã làm:

.directive("list", function() {
  return {
    restrict: "E",
    transclude: true,
    replace: false,
    templateUrl: "contacts/list",
    controller: "CMSController", //- not needed at all
    controllerAs: 'cCtrl'//- not needed at all
  };
})

function config($routeProvider, $locationProvider, $httpProvider) {
  $routeProvider
   ....
    .when('/CMS', {
      templateUrl: 'contacts/index',
      controller: 'CMSController',
      controllerAs: 'cCtrl',
      access: {restricted: true}
    })
  ....
0 hữu ích 0 bình luận chia sẻ
0

một giải pháp khác phù hợp với tôi là nếu bạn đã xác định một chỉ thị, hãy thử không đặt bộ điều khiển của nó thành bộ điều khiển đang gọi nhiều lần, chỉ cần thêm chỉ thị vào ứng dụng của bạn bằng cách sử dụng app.directive.

    app.directive('myDirective',[ '$window', function ($window) {
    function link(scope, element) {
           // stuff
        });
    };

    return {
      restrict: 'A',
      scope: {offset: "@"},
      link: link,
      // controller: myCtrl //myCtrl was called multiple I comment this line
    };
  }]);
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ javascript angularjs controller , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading