`ui-router` $ stateParams 대 $ state.params


116

으로 ui-router, 그것은 가능 주입하거나 $state또는$stateParams 컨트롤러에 하여 URL의 매개 변수에 액세스 할 수 있습니다. $stateParams그러나을 통해 매개 변수에 액세스 하면 해당 매개 변수에 액세스하는 컨트롤러가 관리하는 상태에 속하는 매개 변수와 해당 상위 상태 만 노출되며 $state.params모든 매개 변수는 모든 하위 상태에있는 매개 변수를 포함합니다.

다음 코드에서 URL을 직접로드 http://path/1/paramA/paramB하면 컨트롤러가로드 될 때 다음과 같이 진행됩니다.

$stateProvider.state('a', {
     url: 'path/:id/:anotherParam/',
     controller: 'ACtrl',
  });

$stateProvider.state('a.b', {
     url: '/:yetAnotherParam',
     controller: 'ABCtrl',
  });

module.controller('ACtrl', function($stateParams, $state) {
   $state.params; // has id, anotherParam, and yetAnotherParam
   $stateParams;  // has id and anotherParam
}

module.controller('ABCtrl', function($stateParams, $state) {
   $state.params; // has id, anotherParam, and yetAnotherParam
   $stateParams;  // has id, anotherParam, and yetAnotherParam
}

문제는 왜 차이가 있는가? 그리고 그 중 하나를 사용해야하는시기와 이유에 대한 모범 사례 지침이 있습니까?


훌륭하게 설명 된 질문입니다. 제가 물어 보려고했던 것까지 말해 주셔서 감사합니다!
피터 Nixey

답변:


65

문서는 https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service에서 발견 한 내용을 반복합니다.

내 기억이 도움이된다면 $stateParams원래보다 늦게 소개되었고 $state.params계속해서 쓰는 것을 피하기 위해 간단한 도우미 주입기 인 것 같습니다 $state.params.

모범 사례 지침이 있는지 의심 스럽지만 상황이 나에게 유리합니다. URL로받은 매개 변수에 간단히 액세스하려면을 사용하십시오 $stateParams. 상태 자체에 대해 더 복잡한 것을 알고 싶다면 $state.


1
이 설정 되어 있는지 확인하고 싶었 기 때문에 $state.paramsin을 사용 하고 있습니다. 그렇지 않은 경우 뭔가를 할 수 있습니다. 나는 그것의 세부 사항에 않을거야 무언가 가 자신의 질문을 보증 할 수있다. 하지만을 통해 현재 상태에서 인식하지 못하는 자식 상태에 의해 도입 된 매개 변수를 확인 하여 해킹 을 하고있는 것 같습니다 . 그 이후로 대안을 찾았습니다. ACtrlyetAnotherParam$stateParams
Merott 2014

3
사실이 둘의 차이는 단순한 맥락 이상입니다. $ stateParams는 하위 상태에 더 많은 params가 포함되어 있더라도 $ state가 해당 상태에 적용한다고 간주하는 URL 기반 매개 변수를 캡처합니다 . $ state.params 모든 URL + 비 URL에게의 기반 PARAMS 캡처 보인다 현재 상태 당신이됩니다. 당신이 상태에있는 경우 parent.child, 다음 $stateParams에서 parentController의 URL 기반 PARAMS을 평가합니다 parent들,하지만하지 parent.child. 이 문제를 참조하십시오 .
Amy.js 2015 년

1
반면에 $ stateParams는 사용자 지정 개체, 유형 등을 보존 할 수있는 반면 $ state.params는 "사용자 지정 개체를 일반 개체로 변환"합니다.
Amy.js 2015 년

2
$stateParams반면, 해결 작동 $state.params올바르지 않습니다 (아직 해결되지 않은 상태에 대한 PARAMS 표시되지)
karaxuna

1
스코프는 $ watch $ state.params는 가능하지만 $ stateParams는 볼 수 없습니다. 나는 이유를 모른다.
weltschmerz

19

사용하는 또 다른 이유 $state.params는 비 URL 기반 상태로, (내 생각에는) 문서화가 부족하고 매우 강력합니다.

URL에 노출하지 않고 상태를 전달하는 방법에 대해 인터넷 검색을하면서 이것을 발견하고 다른 곳 에서 질문에 답했습니다 .

기본적으로 다음과 같은 구문을 허용합니다.

<a ui-sref="toState(thingy)" class="list-group-item" ng-repeat="thingy in thingies">{{ thingy.referer }}</a>

안녕하세요 bbrown, 어떻게 든 작동하지 않습니다. 작동하는 예제가 있습니까?
storm_buster 2014

14

편집 :이 답변은 버전에 맞습니다 0.2.10. @Alexander Vasilyev가 지적했듯이 버전에서는 작동하지 않습니다 0.2.14.

사용하는 또 다른 이유 $state.params는 다음과 같은 쿼리 매개 변수를 추출해야하는 경우입니다.

$stateProvider.state('a', {
  url: 'path/:id/:anotherParam/?yetAnotherParam',
  controller: 'ACtrl',
});

module.controller('ACtrl', function($stateParams, $state) {
  $state.params; // has id, anotherParam, and yetAnotherParam
  $stateParams;  // has id and anotherParam
}

2
더 이상 적용 할 수 없습니다. Plunker 참조 : plnkr.co/edit/r2JhV4PcYpKJdBCwHIWS?p=preview
Alexander Vasilyev

4

이 둘 사이에는 많은 차이점이 있습니다. 그러나 실제로 작업하는 동안 나는 $state.params더 나은 것을 발견했습니다 . 더 많은 매개 변수를 사용하면 $stateParams. URL 매개 변수 $state가 아닌 여러 매개 변수를 사용하는 경우 매우 유용합니다.

 .state('shopping-request', {
      url: '/shopping-request/{cartId}',
      data: {requireLogin: true},
      params : {role: null},
      views: {
        '': {templateUrl: 'views/templates/main.tpl.html', controller: "ShoppingRequestCtrl"},
        'body@shopping-request': {templateUrl: 'views/shops/shopping-request.html'},
        'footer@shopping-request': {templateUrl: 'views/templates/footer.tpl.html'},
        'header@shopping-request': {templateUrl: 'views/templates/header.tpl.html'}
      }
    })

3

sth를 해결하는 루트 상태가 있습니다. $stateresolve 매개 변수로 전달 한다고해서 $state.params. 하지만 $stateParams의지를 사용 합니다.

var rootState = {
    name: 'root',
    url: '/:stubCompanyId',
    abstract: true,
    ...
};

// case 1:
rootState.resolve = {
    authInit: ['AuthenticationService', '$state', function (AuthenticationService, $state) {
        console.log('rootState.resolve', $state.params);
        return AuthenticationService.init($state.params);
    }]
};
// output:
// rootState.resolve Object {}

// case 2:
rootState.resolve = {
    authInit: ['AuthenticationService', '$stateParams', function (AuthenticationService, $stateParams) {
        console.log('rootState.resolve', $stateParams);
        return AuthenticationService.init($stateParams);
    }]
};
// output:
// rootState.resolve Object {stubCompanyId:...}

"angular"사용 : "~ 1.4.0", "angular-ui-router": "~ 0.2.15"


2

한 경로에서 다른 경로로 이전 상태 매개 변수를 전달하는 동안 내가 만든 흥미로운 관찰은 $ stateParams가 현재 상태 매개 변수와 함께 전달 된 이전 경로의 상태 매개 변수를 끌어 올려 덮어 쓰지만 $state.params를 사용하면 그렇지 않다는 것입니다.

사용시 $stateParams:

var stateParams        = {};
stateParams.nextParams = $stateParams; //{item_id:123}
stateParams.next       = $state.current.name;

$state.go('app.login', stateParams);
//$stateParams.nextParams on app.login is now:
//{next:'app.details', nextParams:{next:'app.details'}}

$ state.params를 사용하는 경우 :

var stateParams        = {};
stateParams.nextParams = $state.params; //{item_id:123}
stateParams.next       = $state.current.name;

$state.go('app.login', stateParams);
//$stateParams.nextParams on app.login is now:
//{next:'app.details', nextParams:{item_id:123}}

1

이 기사에서는 다음 과 같이 명확하게 설명합니다.이 $state서비스는 현재 상태에 대한 관련 데이터뿐만 아니라 상태를 조작하는 데 유용한 여러 가지 방법을 제공합니다. 현재 상태 매개 변수는 $stateparams 키에서 서비스에 액세스 할 수 있습니다 . $stateParams서비스는 바로이 같은 개체를 반환합니다. 따라서이 $stateParams서비스는 엄격하게 매개 변수 객체에 빠르게 액세스 할 수있는 편의 서비스입니다.$state 서비스입니다.

따라서 어떤 컨트롤러도 $state서비스와 편의 서비스를 모두 주입해서는 안됩니다 $stateParams. 이 경우 $state, 현재 액세스 파라미터 단지 주입되고, 상기 제어기는 다시 주입되어야 $stateParams하는 대신.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.