programing

$routeParams가 메인 컨트롤러에 비어 있습니다.

instargram 2023. 10. 4. 20:55
반응형

$routeParams가 메인 컨트롤러에 비어 있습니다.

제가 가지고 있는 레이아웃 html:

<body ng-controller="MainController">
  <div id="terminal"></div>

  <div ng-view></div>

  <!-- including scripts -->
</body>

지금 보니, 내가 사용하려고 할 때$routeParams인에MainController, 항상 비어있습니다.주의할 점은MainController가능한 모든 경로에 적용되어야 하기 때문에 제 app.js에서 정의하고 있지 않습니다.내 말은, 여기서 그걸 정의하는게 아니라구요.

$routeProvider.when("/view1", {
  templateUrl: "partials/partial1.html"
  controller: "MyCtrl1"
})

$routeProvider.when("/view2", {
  templateUrl: "partials/partial2.html"
  controller: "MyCtrl2"
})

// I'm not defining MainController here!!

사실, 저는 제 문제가 이 문제와 완벽하게 같다고 생각합니다: https://groups.google.com/forum/ #!topic/angular/ib2wHQozeNE

하지만 메인컨트롤러에서 경로 파라미터를 얻는 방법을 아직도 모르겠어요...

편집:

제 말은 제가 메인컨트롤러를 특정 경로와 연결하지 않는다는 뜻입니다.정의되어 있으며, 다른 모든 컨트롤러의 상위 컨트롤러이기도 합니다.내가 알고 싶은 것은 당신이 다음과 같은 URL로 이동할 때입니다./whatever, 같은 경로에 의해 일치하는./:whatever, 메인 컨트롤러는 그렇지 않은 반면 서브 컨트롤러만 경로 파라미터에 액세스할 수 있는 이유는 무엇입니까?어떻게 하면 할 수 있을까요?:whatever메인컨트롤러에 있는 경로 파라미터?

$routeParams서비스가 비동기적으로 채워집니다.즉, 컨트롤러에서 처음 사용할 때 일반적으로 빈 상태로 표시됩니다.

다음 시간에 알림을 받습니다.$routeParams사용자가 채워졌습니다. 에 가입합니다.$routeChangeSuccess에 관한 사건.$scope. (자녀에게 접근할 수 없는 구성요소에 있는 경우$scope, 예를 들어, 서비스 또는 공장, 주입하고 사용할 수 있습니다.$rootScope대신에.)

module.controller('FooCtrl', function($scope, $routeParams) {
  $scope.$on('$routeChangeSuccess', function() {
    // $routeParams should be populated here
  });
);

경로에 의해 사용되거나 경로에 의해 포함된 템플릿 내에서 사용되는 컨트롤러는 완전히 채워진 컨트롤러에 즉시 액세스할 수 있습니다.$routeParams왜냐면ng-view기다리다$routeChangeSuccess계속하기 전에 이벤트를 실행합니다.(어떤 템플릿/컨트롤러를 로드할지 결정하기 위해서는 경로 정보가 필요하기 때문에 기다려야 합니다.)

컨트롤러가 내부에서 사용된다는 것을 알고 있는 경우ng-view, 라우팅 이벤트를 기다릴 필요가 없습니다.컨트롤러가 그렇지 않을 것이라는 것을 안다면, 그럴 것입니다.확신할 수 없다면 두 가지 가능성을 분명히 고려해야 할 것입니다.구독하기$routeChangeSuccess충분하지 않을 것입니다. 이벤트는 다음과 같은 경우에만 볼 수 있습니다.$routeParams아직 채워지지 않았습니다:

module.controller('FooCtrl', function($scope, $routeParams) {
  // $routeParams will already be populated
  // here if this controller is used within ng-view

  $scope.$on('$routeChangeSuccess', function() {
    // $routeParams will be populated here if
    // this controller is used outside ng-view
  });
);

플롱0이 언급한 $타임아웃에 대한 대안으로...

또한 $route 서비스를 주입할 수 있으며, 이 서비스는 당신의 파라미터를 즉시 보여줄 것입니다.

angular.module('MyModule')
  .controller('MainCtrl', function ($scope, $route) {
      console.log('routeParams:'+JSON.stringify($route.current.params));
  });

저도 같은 문제가 있습니다.

제가 발견한 것은 $routeParams가 메인컨트롤러에 로드되는 데 시간이 좀 걸린다는 것입니다. 아마도 메인컨트롤러를 먼저 시작한 다음 $routeParams를 하위컨트롤러에 설정할 것입니다.Main Controller $scope에서 메서드를 만들고 Child Controller에서 $routeParams를 전달하는 방법을 사용했습니다.

angular.module('MyModule')
  .controller('MainController', ["$scope", function ($scope) {
    $scope.parentMethod = function($routeParams) {
     //do stuff
    }
  }]);

angular.module('MyModule')
  .controller('MyCtrl1', ["$scope", function ($scope) {
    $scope.parentMethod($routeParams);
  }]);

angular.module('MyModule')
  .controller('MyCtrl2', ["$scope", function ($scope) {
    $scope.parentMethod($routeParams);
  }]);

Andre가 $routeParams가 메인 컨트롤러에 로드하는 데 잠시 시간이 걸리는 것에 대해 그의 답변에서 언급한 것을 토대로, 저는 그것을 제 메인 Ctrl 내부의 타임아웃에 넣었습니다.

angular.module('MyModule')
  .controller('MainCtrl', function ($scope, $routeParams, $timeout) {

    $timeout(function(){
      // do stuff with $routeParams
      console.log('routeParams:'+JSON.stringify($routeParams));
    }, 20);

  });

$routeParams를 사용하기 위한 20ms 지연은 눈에 띄지도 않으며, 그 미만의 결과는 일관되지 않은 것으로 보입니다.

좀 더 구체적으로 말하면, 다른 프로젝트 구조(요그 앵글)로 작동하는 설정이 정확히 동일했기 때문에 혼란스러웠고 프로젝트(요그 앵글 풀스택)를 재구축했을 때 문제가 발생하기 시작했습니다.

여기에는 적어도 두 가지 문제가 있습니다.

  • 와 함께$routeParams다를 하지 않은를 얻을 수 .

  • 메인 컨트롤러를 정의하는 파일은 중요하지 않습니다.중요한 것은 어느 모듈/기능에 있느냐 하는 것입니다.

변수는 해야 합니다.$routeProvider:paramName:

$routeProvider.when("/view2/name1/:a/name2/:b"

할 수 $routeParams.paramName.

와 같이.index.html?k1=v1&k2=v2.

app.js 및 다입니다)가 것입니다..config 및 block)합니다를 합니다.

var myapp = angular.module(...);

이 모듈은 지시 또는 서비스와 같은 종속성으로 다른 모듈을 가질 수도 있고 기능별 모듈을 가질 수도 있습니다.간단한 접근법은 컨트롤러를 캡슐화하는 모듈을 갖는 것입니다.원래 코드에 더 가까운 접근 방법은 메인 모듈에 적어도 하나의 컨트롤러를 넣는 것입니다.

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

혹시 컨트롤러를 글로벌 기능으로 정의하신 것은 아닐까요?function MainCtrl() {...}로 인해 이로 인해 전역 네임스페이스가 오염됩니다.피합니다.

메인 모듈에서 컨트롤러를 정의한다고 해서 "모든 경로에서 적용"이 되는 것은 아닙니다.이것은 다음과 같이 정의되어야 합니다.$routeProvider또는 각 경로의 컨트롤러를 메인 컨트롤러로부터 "inherit"하도록 합니다.이와 같이, 각 경로의 제어기는 경로가 변경된 후에 인스턴스화되는 반면, 주 제어기는 라인이 변경된 경우에 한 번만 인스턴스화됩니다.ng-controller="MainCtrl"한 달생)

컨트롤러에 정의된 $routeParams 값을 $rootScope에 전달하기만 하면 됩니다.

.controller('MainCtrl', function ($scope, $routeParams, MainFactory, $rootScope) {
    $scope.contents = MainFactory.getThing($routeParams.id);
    $rootScope.total = MainFactory.getMax(); // Send total to the rootScope
}

IndexCtrl에 $rootScope을 주입합니다(index.html 관련).

.controller('IndexCtrl', function($scope, $rootScope){
    // Some code
});

언급URL : https://stackoverflow.com/questions/17519937/routeparams-is-empty-in-main-controller

반응형