UI 라우터를 사용하여 객체를 상태로 전달하는 방법은 무엇입니까?


119

ui-router를 사용하여 상태로 전환하고 임의의 개체를 전달할 수 있기를 원합니다.

일반적 $stateParams으로 사용 된다는 것을 알고 있지만이 값이 URL에 삽입되어 있다고 생각하며 사용자가이 데이터를 북마크 할 수 없도록하고 싶습니다.

이런 식으로하고 싶습니다.

$state.transitionTo('newState', {myObj: {foo: 'bar'}});

function myCtrl($stateParams) {
   console.log($stateParams.myObj); // -> {foo: 'bar'}
};

URL에 값을 인코딩하지 않고이를 수행하는 방법이 있습니까?


1
ui-router 메커니즘은 탐색에서 URL 상태를 유지합니다. 따라서 사용자가 페이지를 새로 고치면 해당 페이지로 돌아갑니다.이 동작을 사용하지 않으려면 다른 메카니즘 (컨트롤러 / 지시문 등의 원시 기능)을 사용하고 쿠키를 사용하십시오. 임시 데이터를 저장하기위한 저장
Neozaru을

URL과 함께 localStorage를 데이터의 키로 사용 하시겠습니까?
Neil

2
가치는 어디에서 오는가? Ui.router에는 요청 된 상태로 전환하기 전에 데이터를 범위에로드하는 "해결"개념이 있습니다. 마찬가지로 onEnter 및 onExit 메서드가 있습니다. 또한 로컬 저장소를 사용할 수 있습니다.
Josh C.

@JoshC로. 언급했듯이 상태로 이동하기 전에 데이터를 확인하는 것이 좋습니다. github.com/angular-ui/ui-router/wiki#resolve
TrazeK 2014-08-06

공식적으로 수행하는 방법은 stackOverlord의 답변을 참조하십시오.
AlikElzin-kilaka 2015 년

답변:


163

버전 0.2.13에서는 $ state.go로 객체를 전달할 수 있어야합니다.

$state.go('myState', {myParam: {some: 'thing'}})

$stateProvider.state('myState', {
                url: '/myState/{myParam:json}',
                params: {myParam: null}, ...

컨트롤러의 매개 변수에 액세스합니다.

$stateParams.myParam //should be {some: 'thing'}

myParam은 URL에 표시되지 않습니다.

출처:

편의를 위해 여기에 재현 된 christopherthielen https://github.com/angular-ui/ui-router/issues/983 의 주석을 참조하십시오 .

christopherthielen : 예, 이것은 0.2.13에서 작동합니다.

.state ( 'foo', {url : '/ foo / : param1? param2', params : {param3 : null} // null이 기본값 임});

$ state.go ( 'foo', {param1 : 'bar', param2 : 'baz', param3 : {id : 35, name : 'what'}});

'foo'의 $ stateParams는 이제 {param1 : 'bar', param2 : 'baz', param3 : {id : 35, name : 'what'}}입니다.

URL은 / foo / bar? param2 = baz입니다.


함께 작동 transitionTo합니다.
AlikElzin-kilaka 2015-06-03

13
나는 뭔가 잘못하고 있어야한다 :-/ 나는 0.2.13에 있지만 내가 통과하고 반대하려고 시도하면 문자열로 상태가 나옵니다[object Object]
ErichBSchulz

15
@ErichBSchulz이 답변에는 포함되어 있지 않지만이 작업을 수행하는 트릭은 상태의 URL 문자열에 매개 변수 이름을 포함하고 유형을 JSON으로 지정하는 것입니다. 전의. 이 기능에 대한 0.2.13 릴리스 정보 및 코드 주석을 $stateProvider.state('myState', { url: '/myState/{myParam:json}', params: {myParam: null},...참조하십시오 .
Syon

1
내 URL에 ID 매개 변수가 있고이를 매개 변수 객체에도 추가해야했습니다. { url: '/mystate/{id:[0-9]+}', params: { id: null, myParam: null }, ...
GraehamF

3
흑 마법이 있어야합니다. 내 전체 json이 URL을 표시하고 있습니다. (((
Kabachok

25

이 문제에는 두 부분이 있습니다.

1) URL을 변경하지 않는 매개 변수 사용 (params 속성 사용) :

$stateProvider
    .state('login', {
        params: [
            'toStateName',
            'toParamsJson'
        ],
        templateUrl: 'partials/login/Login.html'
    })

2) 객체를 매개 변수로 전달 : 글쎄, 모든 매개 변수가 문자열로 변환되기 때문에 지금 직접 수행하는 방법 은 없습니다 ( 편집 : 0.2.13 이후, 더 이상 사실이 아닙니다-객체를 직접 사용할 수 있음). 직접 문자열을 작성하여 해결할 수 있습니다.

toParamsJson = JSON.stringify(toStateParams);

대상 컨트롤러에서 개체를 다시 직렬화 해제합니다.

originalParams = JSON.parse($stateParams.toParamsJson);

1
실제로 객체를 전달하는 것은 꽤 좋은 해킹입니다. :)
Tek

객체를 직접 전달할 수 있습니다. 허용 대답 확인
키 쇼어 Relangi

20

실제로 할 수 있습니다.

$state.go("state-name", {param-name: param-value}, {location: false, inherit: false});

이것은 state.go의 옵션에 대한 공식 문서입니다.

모든 것이 거기에 설명되어 있으며 보시다시피 이것이 수행되는 방법입니다.


이 정확한 코드를 시도했지만 개체가 보존되지 않았습니다.
Virmundi 2014 년

1
객체를 전달할 수는 없습니다. 단일 매개 변수 값만 전달할 수 있습니다 .... yo 객체로 만들려면 모든 속성을 다른 URL 매개 변수로 넣어야합니다. Angular-ui-router 개발자는 여전히 전체 개체를 전달하기 위해 노력하고 있습니다. 사실 그 사람들 Svatopluk Ledl은 좋은 해결책을주었습니다. 객체를 전체 json 문자열로 만들고 그 후에 파싱하십시오. :)
Tek

13

Btw 당신은 또한 당신의 템플릿에서 ui-sref 속성을 사용하여 객체를 전달할 수 있습니다

ui-sref="myState({ myParam: myObject })"

1
.state에서이 개체를받는 방법
Shubham

@Shubham은 객체를 수신 할 상태에 대한 'params'를 구성한 다음 $ stateParams를 사용하여 해당 객체를 검색합니다. 자세한 내용은 angular-ui.github.io/ui-router/site/#/api/… 문서를 참조하십시오 .
tao 2016 년

이것은 작동하지만 페이지 새로 고침 후 데이터를 유지할 수 없습니다.
tao

9

1)

$stateProvider
        .state('app.example1', {
                url: '/example',
                views: {
                    'menuContent': {
                        templateUrl: 'templates/example.html',
                        controller: 'ExampleCtrl'
                    }
                }
            })
            .state('app.example2', {
                url: '/example2/:object',
                views: {
                    'menuContent': {
                        templateUrl: 'templates/example2.html',
                        controller: 'Example2Ctrl'
                    }
                }
            })

2)

.controller('ExampleCtrl', function ($state, $scope, UserService) {


        $scope.goExample2 = function (obj) {

            $state.go("app.example2", {object: JSON.stringify(obj)});
        }

    })
    .controller('Example2Ctrl', function ($state, $scope, $stateParams) {

        console.log(JSON.parse($state.params.object));


    })

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