$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
'programing' 카테고리의 다른 글
Ajax 시나리오에서 오류를 반환하는 방법 (0) | 2023.10.04 |
---|---|
Oracle 11GR2 TKPROF - 재귀적 콜 트리를 캡처하는 방법 (0) | 2023.10.04 |
Python에서 요청이 AJAX인지 확인합니다. (0) | 2023.10.04 |
설치된 Android 응용프로그램 목록을 가져와서 실행할 응용프로그램을 선택하는 방법 (0) | 2023.10.04 |
wp 플러그인 활성화 시 여러 사용자 지정 DB 테이블을 만들 수 없습니다. (0) | 2023.10.04 |