Làm cách nào để chuyển một đối tượng vào một trạng thái bằng UI-router?


119

Tôi muốn có thể chuyển đổi sang một trạng thái và chuyển một đối tượng tùy ý bằng cách sử dụng ui-router.

Tôi biết rằng $stateParamsgiá trị đó thường được sử dụng, nhưng tôi tin rằng giá trị này được chèn vào URL và tôi không muốn người dùng có thể đánh dấu dữ liệu này.

Tôi muốn làm một cái gì đó như thế này.

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

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

Có cách nào để làm điều này mà không cần mã hóa các giá trị vào URL không?


1
các cơ chế ui-router duy trì trạng thái URL trên điều hướng. Do đó, nếu người dùng làm mới trang, anh ta sẽ quay lại trang mà anh ta đã ở đó. Nếu bạn không muốn sử dụng hành vi này, hãy xem xét sử dụng các mecanisms khác (các chức năng thô trong bộ điều khiển / chỉ thị của bạn, v.v.) và sử dụng cookie / lưu trữ để lưu trữ dữ liệu tạm thời
Neozaru

Có thể sử dụng localStorage với url làm khóa cho dữ liệu của bạn?
Neil

2
Các giá trị đến từ đâu? Ui.router có khái niệm "giải quyết" để tải dữ liệu vào một phạm vi trước khi chuyển sang trạng thái được yêu cầu. Tương tự có các phương thức onEnter và onExit. Ngoài ra, bạn có thể sử dụng bộ nhớ cục bộ.
Josh C.

Là @JoshC. đã đề cập, có vẻ như bạn có thể muốn xem xét việc giải quyết dữ liệu trước khi chuyển sang trạng thái. github.com/angular-ui/ui-router/wiki#resolve
TrazeK

Hãy xem câu trả lời của stackOverlord như cách thực hiện chính thức.
AlikElzin-kilaka

Câu trả lời:


163

Trong phiên bản 0.2.13, Bạn có thể chuyển các đối tượng vào $ state.go,

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

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

và sau đó truy cập tham số trong bộ điều khiển của bạn.

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

myParam sẽ không hiển thị trong URL.

Nguồn:

Xem bình luận của christopherthielen https://github.com/angular-ui/ui-router/issues/983 , được sao chép tại đây để thuận tiện:

christopherthielen: Vâng, điều này sẽ hoạt động ngay bây giờ trong 0.2.13.

.state ('foo', {url: '/ foo /: param1? param2', params: {param3: null} // null là giá trị mặc định});

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

$ stateParams trong 'foo' hiện là {param1: 'bar', param2: 'baz', param3: {id: 35, name: 'what'}}

url là / foo / bar? param2 = baz.


Hoạt động với transitionTocả.
AlikElzin-kilaka

13
Tôi phải làm điều gì đó sai: - / Tôi đang ở trên 0.2.13 nhưng nếu tôi cố gắng vượt qua và phản đối, nó sẽ xuất hiện ở trạng thái là chuỗi [object Object]
ErichBSchulz

15
@ErichBSchulz Mặc dù nó không được bao gồm trong câu trả lời này, nhưng mẹo để thực hiện công việc này là bao gồm tên tham số trong chuỗi URL của trạng thái và chỉ định loại là JSON. Ví dụ. $stateProvider.state('myState', { url: '/myState/{myParam:json}', params: {myParam: null},...Xem ghi chú phát hành 0.2.13 và nhận xét mã cho tính năng này.
Syon

1
Tôi đã có một tham số id trong URL của mình và cũng phải thêm thông số đó vào đối tượng tham số. { url: '/mystate/{id:[0-9]+}', params: { id: null, myParam: null }, ...
GraehamF

3
Phải có một số ma thuật đen lúc chơi - cả json tôi đang hiển thị các url: (((
Kabachok

25

Có hai phần của vấn đề này

1) sử dụng tham số không làm thay đổi url (sử dụng thuộc tính params):

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

2) truyền một đối tượng dưới dạng tham số: Chà, không có cách nào trực tiếp để thực hiện điều đó ngay bây giờ, vì mọi tham số đều được chuyển đổi thành chuỗi ( CHỈNH SỬA : kể từ 0.2.13, điều này không còn đúng nữa - bạn có thể sử dụng trực tiếp các đối tượng), nhưng bạn có thể giải quyết bằng cách tạo chuỗi của riêng bạn

toParamsJson = JSON.stringify(toStateParams);

và trong bộ điều khiển mục tiêu lại deserialize đối tượng

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

1
Trên thực tế, để vượt qua các đối tượng, đây là một hack khá hay :)
Tek

chúng ta có thể truyền trực tiếp đối tượng. kiểm tra câu trả lời được chấp nhận
Kishore Relangi

20

Trên thực tế, bạn có thể làm điều này.

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

Đây là tài liệu chính thức về các tùy chọn trong state.go

Mọi thứ được mô tả ở đó và như bạn có thể thấy đây là cách để được thực hiện.


Tôi đã thử mã chính xác này và đối tượng không được bảo toàn.
Virmundi

1
bạn không thể truyền các đối tượng, bạn chỉ có thể truyền các giá trị tham số duy nhất .... để làm cho nó trở thành một đối tượng, bạn phải đặt tất cả các thuộc tính dưới dạng các tham số url khác nhau. Các nhà phát triển Angular-ui-router vẫn đang làm việc để truyền toàn bộ đối tượng. Trên thực tế, guys Svatopluk Ledl đã đưa ra một giải pháp tốt đẹp. Chỉ cần tạo đối tượng dưới dạng một chuỗi json toàn bộ và sau đó phân tích cú pháp. :)
Tek

13

Btw, bạn cũng có thể sử dụng thuộc tính ui-sref trong các mẫu của mình để chuyển các đối tượng

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

1
Làm thế nào để chúng tôi nhận được đối tượng này trong .state
Shubham

@Shubham bạn sẽ định cấu hình 'tham số' cho trạng thái sẽ nhận đối tượng, sau đó sử dụng $ stateParams để truy xuất đối tượng đó. xem tài liệu angle-ui.github.io/ui-router/site/#/api/… để biết chi tiết.
tao

điều này hoạt động nhưng không thể giữ dữ liệu sau khi làm mới trang.
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));


    })

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.