Làm cách nào để gửi và truy xuất các tham số bằng cách sử dụng $ state.go toParams và $ stateParams?


123

Tôi đang sử dụng AngularJS v1.2.0-rc.2 với ui-router v0.2.0. Tôi muốn vượt qua tình trạng giới thiệu sang tiểu bang khác vì vậy tôi sử dụng toParamscác $state.gogiống như vậy:

$state.go('toState', {referer: $state.current.name});

Theo các tài liệu , điều này sẽ đưa $stateParamsvào toStatebộ điều khiển, nhưng nó là undefined. Tôi đang thiếu gì?

Tôi đã tạo ra một plunk để chứng minh:

http://plnkr.co/edit/ywEcG1

Câu trả lời:


147

Nếu bạn muốn chuyển trạng thái không phải URL, thì bạn không được sử dụng urlkhi thiết lập state. Tôi tìm thấy câu trả lời trên một PR và làm một số trò đùa xung quanh để hiểu rõ hơn.

$stateProvider.state('toState', {
  templateUrl:'wokka.html',
  controller:'stateController',
  params: {
    'referer': 'some default', 
    'param2': 'some default', 
    'etc': 'some default'
  }
});

Sau đó, bạn có thể điều hướng đến nó như vậy:

$state.go('toState', { 'referer':'jimbob', 'param2':37, 'etc':'bluebell' });

Hoặc là:

var result = { referer:'jimbob', param2:37, etc:'bluebell' };
$state.go('toState', result);

Và trong HTML cũng vậy:

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

Ca sử dụng này hoàn toàn chưa được khám phá trong tài liệu, nhưng tôi nghĩ đó là một phương tiện mạnh mẽ để chuyển trạng thái mà không sử dụng URL.


2
LƯU Ý: (trên v0.2.10) Nếu trạng thái là trạng thái con của cha mẹ có tham số URL, thì tham số đó cần được đưa vào paramsmảng.
ivarni

5
Tôi đã gặp lỗi khi nói "Thiếu tham số bắt buộc" khi tôi liệt kê các thông số dưới dạng một mảng trong định nghĩa trạng thái. Thay vào đó, hãy liệt kê chúng dưới dạng băm như{referer: true, param2: true, etc: true}
Dave Ceddia

1
Điều này không làm việc cho tôi trong v0.2.13 mới nhất. Có lẽ, nó không có giấy tờ vì một lý do.
demisx

1
Mới nhất, bạn cần thay đổi params thành một đối tượng. so params: {myParam: {value: defaultValue / không xác định }}
rbnzdave

2
Làm thế nào tôi có thể nhận được dữ liệu trong bộ điều khiển?
Shylendra Madda

47

Giải pháp của Nathan Matthews không hiệu quả với tôi nhưng nó hoàn toàn chính xác nhưng có rất ít điểm để đạt được một cách giải quyết:

Điểm mấu chốt là: Loại tham số được xác định và toParamas của $ state.go phải là cùng một mảng hoặc đối tượng trên cả hai mặt của quá trình chuyển đổi trạng thái.

Ví dụ: khi bạn xác định tham số trong trạng thái như sau, bạn có nghĩa là thông số là mảng vì sử dụng "[]":

$stateProvider
.state('home', {
    templateUrl: 'home',
    controller:  'homeController'
})
.state('view', {
    templateUrl: 'overview',
    params:      ['index', 'anotherKey'],
    controller:  'overviewController'
})

Vì vậy, bạn cũng nên truyền toParams dưới dạng mảng như thế này:

params = { 'index': 123, 'anotherKey': 'This is a test' }
paramsArr = (val for key, val of params)
$state.go('view', paramsArr)

Và bạn có thể truy cập chúng thông qua $ stateParams dưới dạng mảng như thế này:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams[0];
    var anotherKey = $stateParams[1];
});

Giải pháp tốt hơn là sử dụng đối tượng thay vì mảng ở cả hai bên :

$stateProvider
.state('home', {
    templateUrl: 'home',
    controller:  'homeController'
})
.state('view', {
    templateUrl: 'overview',
    params:      {'index': null, 'anotherKey': null},
    controller:  'overviewController'
})

Tôi đã thay thế [] bằng {} trong định nghĩa params. Để chuyển toParams sang $ state.go, bạn cũng nên sử dụng đối tượng thay vì mảng:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })

sau đó bạn có thể truy cập chúng thông qua $ stateParams một cách dễ dàng:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams.index;
    var anotherKey = $stateParams.anotherKey;
});

Chắc chắn nó hoạt động và tôi đã sử dụng nó trong dự án của tôi. Bạn đã kiểm tra nó? Hãy cho tôi biết vấn đề, nếu bạn kiểm tra nó.
Reza Rahimi

1
nó không phải là một định dạng đối tượng {'index', 'AnotherKey'} làm thế nào điều này có thể hoạt động? Tôi đã thử nó. Nó không hoạt động.
maxisam

Đặt đoạn mã của bạn, phiên bản hoặc một cái gì đó có thể giúp giải quyết vấn đề. Tôi đã sử dụng các phiên bản này: AngularJS v1.2.26, ui-router v0.2.11, CoffeeScript tôi cũng đã sử dụng phiên bản bower của chúng.
Reza Rahimi

3
điều này hoạt động, tuy nhiên thay thế params: {'index', 'anotherKey'},bằng params: {'index' : 'dummy', 'anotherKey' : 'dummy'},cách khác nó không phải là một đối tượng javascript hợp lệ
ps0604

28

Tất cả những gì tôi phải làm là thêm một tham số vào định nghĩa trạng thái url như vậy

url: '/toState?referer'

Đừng!


Cách duy nhất tôi có thể làm cho điều này hoạt động với /toState/:referercú pháp là sử dụng $location.path()thay vì $state.go().
nshew

Bạn không tìm thấy giải pháp nào khác bằng chức năng của ui-router?
Jason

có một cách để làm điều này hoạt động với $ state.go (). Mất một thời gian để làm cho đúng. Xem ví dụ của tôi ở đây.
mbokil

Nó đã làm việc. Tuy nhiên có thể không rõ ràng nếu bạn muốn truyền hai tham số; Vì vậy, dòng sau đây lừa. url: "/ danh bạ? myParam1 & myParam2"
eduardo92

15

Không chắc chắn nếu nó sẽ hoạt động với AngularJS v1.2.0-rc.2 với ui-router v0.2.0. Tôi đã thử nghiệm giải pháp này trên AngularJS v1.3.14 với ui-router v0.2.13.

Tôi chỉ nhận ra rằng không cần thiết phải truyền tham số trong URL như gwhn khuyến nghị.

Chỉ cần thêm các tham số của bạn với một giá trị mặc định trên định nghĩa trạng thái của bạn. Trạng thái của bạn vẫn có thể có giá trị Url.

$stateProvider.state('state1', {
    url : '/url',
    templateUrl : "new.html",
    controller : 'TestController',
    params: {new_param: null}
});

và thêm thông số vào $state.go()

$state.go('state1',{new_param: "Going places!"});


Coll ... Bạn đã cứu người đàn ông của tôi! Giải pháp đơn giản và trực tiếp.
Bây giờ,

15

Không có ví dụ nào trên trang này làm việc cho tôi. Đây là những gì tôi đã sử dụng và nó hoạt động tốt. Một số giải pháp cho biết bạn không thể kết hợp url với $ state.go () nhưng điều này không đúng. Điều khó xử là bạn phải xác định các thông số cho url và cũng liệt kê các thông số. Cả hai phải có mặt. Đã thử nghiệm trên Angular 1.4.8 và UI Router 0.2.15.

Trong trạng thái thêm thông số của bạn vào cuối trạng thái và xác định thông số:

url: 'view?index&anotherKey',
params: {'index': null, 'anotherKey': null}

Trong bộ điều khiển của bạn, câu lệnh go của bạn sẽ trông như thế này:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' });

Sau đó, để kéo các thông số ra và sử dụng chúng trong bộ điều khiển của trạng thái mới của bạn (đừng quên chuyển $ stateParams cho chức năng điều khiển của bạn):

var index = $stateParams.index;
var anotherKey = $stateParams.anotherKey;
console.log(anotherKey); //it works!

11

Trong trường hợp của tôi, tôi đã thử với tất cả các tùy chọn được đưa ra ở đây, nhưng không ai hoạt động đúng (góc 1.3.13, ionic 1.0.0, angular-ui-router 0.2.13). Giải pháp là:

.state('tab.friends', {
      url: '/friends/:param1/:param2',
      views: {
        'tab-friends': {
          templateUrl: 'templates/tab-friends.html',
          controller: 'FriendsCtrl'
        }
      }
    })

và trong trạng thái.go:

$state.go('tab.friends', {param1 : val1, param2 : val2});

Chúc mừng


Điều này làm việc tốt với tôi, với điều kiện bộ điều khiển tôn trọng param cùng tên, ví dụ như $ stateParams.param1.
nuander 20/07/2015

vâng @nuander, tôi đã quên đề cập đến cách truy cập vào biến đó, cảm ơn vì điều đó!
Cris R

8

Tôi đã dành rất nhiều thời gian để chiến đấu với $ state & $ stateParams của Ionic / Angular;

Để sử dụng $ state.go () và $ stateParams, bạn phải có một số thứ nhất định thiết lập và các tham số khác không được có mặt.

Trong app.config () của tôi, tôi đã bao gồm $ stateProvider và được xác định trong một số trạng thái:

$stateProvider
    .state('home', {
        templateUrl: 'home',
        controller:  'homeController'
    })
    .state('view', {
        templateUrl: 'overview',
        params:      ['index', 'anotherKey'],
        controller:  'overviewController'
    })

Các paramsĐiều quan trọng là đặc biệt quan trọng. Đồng thời, lưu ý rằng KHÔNG có urlkhóa nào hiện diện ... sử dụng stateParams và URL KHÔNG trộn lẫn. Họ là loại trừ lẫn nhau.

Trong lệnh gọi $ state.go (), hãy định nghĩa nó như sau:

$state.go('view', { 'index': 123, 'anotherKey': 'This is a test' })

Các biến indexanotherKey$ stateParams sẽ CHỈ được điền nếu chúng được liệt kê đầu tiên trong paramskhóa xác định $ stateControll .

Trong bộ điều khiển, bao gồm $ stateParams như minh họa:

app.controller('overviewController', function($scope, $stateParams) {
    var index = $stateParams.index;
    var anotherKey = $stateParams.anotherKey;
});

Các biến đã qua nên có sẵn!


Giá trị có thể là một đối tượng JSON không? Giống như $ state.go ('view', {'editObj': {val1: 2, val2: 3, val4: 'Xin chào'}}). Bởi vì điều này không làm việc cho tôi.
PavanSandeep 11/05/2015

6

Thử với reload: true?

Không thể hiểu chuyện gì đang diễn ra trong thời gian dài nhất - hóa ra tôi đang tự lừa mình. Nếu bạn chắc chắn rằng mọi thứ được viết chính xác và bạn sẽ sử dụng cùng một trạng thái, hãy thử reload: true:

.state('status.item', {
    url: '/:id',
    views: {...}
}

$state.go('status.item', { id: $scope.id }, { reload: true });

Hy vọng điều này giúp bạn tiết kiệm thời gian!


5

Tôi đã đối mặt với một vấn đề tương tự. Tôi đã kết thúc với một giải pháp làm việc sau rất nhiều googling và thử nghiệm và thử nghiệm. Đây là giải pháp của tôi sẽ làm việc cho bạn.

Tôi có hai bộ điều khiển - searchBoxContoderstateResultControll và một tham số có tên searchQuery được truyền từ một khung nhìn có hộp tìm kiếm sang một khung nhìn hiển thị các kết quả được tìm nạp từ máy chủ từ xa. Đây là cách bạn làm điều đó:

Dưới đây là bộ điều khiển mà bạn gọi chế độ xem tiếp theo bằng cách sử dụng $state.go()

.controller('searchBoxController', function ($scope, $state) {
        $scope.doSearch = function(){
            var searchInputRaw = $scope.searchQueryInput;
            $state.go('app.searchResults', { searchQuery: searchInput });
        }
    })

Dưới đây là trạng thái sẽ được gọi khi $state.go()được thực thi:

.state('app.searchResults', 
            {
                url: '/searchResults',
                views:
                {
                    'menuContent': { templateUrl: 'templates/searchResult.html', controller: 'stateResultController' }
                },
                params: 
                {
                    'searchQuery': ''
                }
            })

Và cuối cùng, bộ điều khiển liên quan đến app.searchResultstrạng thái:

.controller('stateResultController', function ($scope, $state, $stateParams, $http) {
        $scope.searchQueryInput = $stateParams.searchQuery;
    });

1
Điều này làm việc cho tôi và nó chính xác là những gì tôi cần, vì tôi không muốn vượt qua param trong URL nhưng cần thuộc tính url trong khai báo trạng thái.
Ernani

3

Và trong trường hợp của tôi về tình trạng cha mẹ / con cái. tất cả các tham số được khai báo ở trạng thái con phải được biết bởi trạng thái cha

        .state('full', {
            url: '/full',
            templateUrl: 'js/content/templates/FullReadView.html',
            params: { opmlFeed:null, source:null },
            controller: 'FullReadCtrl'
        })
        .state('full.readFeed', {
            url: '/readFeed',
            views: {
                'full': {
                    templateUrl: 'js/content/templates/ReadFeedView.html',
                    params: { opmlFeed:null, source:null },
                    controller: 'ReadFeedCtrl'
                }
            }
        })

2

Giải pháp chúng tôi đã có một trạng thái có 2 tham số đang thay đổi:

.state('somestate', {
  url: '/somestate',
  views: {...}
}

đến

.state('somestate', {
  url: '/somestate?id=:&sub=:',
  views: {...}
}

1

Xác định của bạn sau trong router.js

$stateProvider.state('users', {
    url: '/users',
    controller: 'UsersCtrl',
    params: {
        obj: null
    }
})

Bộ điều khiển của bạn cần thêm $ stateParams.

function UserCtrl($stateParams) {
    console.log($stateParams);
}

Bạn có thể gửi một đối tượng theo tham số như sau.

$state.go('users', {obj:yourObj});

1

Tôi đã cố gắng điều hướng từ Trang 1 đến 2 và tôi cũng phải truyền một số dữ liệu.

Trong router.js của tôi , tôi đã thêm têntuổi của params :

.state('page2', {
          url: '/vehicle/:source',
          params: {name: null, age: null},
.................

Trong Trang1 , onClick của nút tiếp theo:

$state.go("page2", {name: 'Ron', age: '20'});

Trong trang 2 , tôi có thể truy cập các thông số đó:

$stateParams.name
$stateParams.age

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.