สิ่งที่ควรรู้
การใช้งาน $state.go()
จากตัวอย่างที่ผ่านมาเราใช้ ui-sref ในการย้าย state คราวนี้เราจะมาลองใช้ $state.go() ดูกันบ้าง โดยการใช้งานมีลักษณะดังนี้
- to - ชื่อ state ที่ต้องการจะไป โดยมีตัวอย่างการใช้ดังนี้
- $state.go('contact.detail') - จะไปยัง state contact.detail
- $state.go('^') - จะไปยัง parent state
- $state.go('^.sibling') - จะไปยัง state sibling ที่มี parent เดียวกัน
- $state.go('.child.grandchild') - จะไปยัง state ลูกของลูก
- toParams - พารามิเตอร์ส่งไปยัง state นั้น
- options - ใช้สำหรับกำหนดค่าเพิ่มเติม โดยมีตัวเลือกดังนี้
- location (Boolean / "replace") - [default: true] กรณีที่เป็น true จะทำการ update url ใน location bar ของ browser กรณีที่เป็น "replace" จะทำการ update url และ replace history record สุดท้าย
- inherit (Boolean) - [default: false] กรณีที่เป็น true จะทำการ inherit url parameter ของ url ส่งไปด้วย
- relative (stateObject) - [default: $state.$current] เมื่อทำการเปลี่ยน state ด้วย relative path
เช่น '^' จะกำหนดให้ state นั้นเป็น relative from
- notify (Boolean) - [default: true] กรณีที่เป็น true จะทำการ broadcast event [$stateChangeStart] และ [$stateChangeSuccess]
- reload (Boolean) - [default: false] กรณที่เป็น true จะบังคับให้ทำการเปลี่ยน state หากอยู่ใน state เดิมก็ทำการ reload หน้านั้นใหม่
$state.go(to [, toParams] [, options]);
ตัวอย่างการใช้งาน $state.go()
กำหนด state ไว้ 3 state โดยให้มี controller ประกาศฟังก์ชั่นสำหรับเรียกใช้งาน $state.go() และกำหนดปุ่ม ให้เมื่อคลิกจะข้ามไป state อื่นๆ
angular.module('application', ['ui.router']) .config(function ($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/one'); $stateProvider .state('one', { url: '/one', template: '<p>this is state one</p><p ui-view></p>' + '<button class="btn btn-default" ng-click="linkTo(stateName)">State Two</button>' + '<button class="btn btn-default" ng-click="linkTo(stateName2)">State Three</button>', controller: function ($state, $scope) { $scope.stateName = "one.two"; $scope.stateName2 = "three"; $scope.linkTo = function (state) { console.log(state); $state.go(state); }; } }) .state('one.two', { url: '/two', template: '<p>this is state one-two</p>' }) .state('three', { url: '/three', template: '<p>this is state three</p>' }); });
ในไฟล์ html ทำการกำหนดดังนี้
<div class="container"> <ul class="nav nav-pills"> <li><a ui-sref="one">State One</a></li> <li><a ui-sref="one.two">State Two</a></li> <li><a ui-sref="three">State Three</a></li> </ul> <div> <p>Event show on log ,please open the console</p> <div ui-view></div> </div> </div>
สามารถดูตัวอย่างผลลัพธ์ได้ที่นี่ Demo
กรณีที่มีตัวแปรส่งแบบ Object เราจำเป็นต้องกำหนดดังนี้
$stateProvider .state('A', { controller: function ($scope, $state) { $scope.arrayOject = [{name: 'bob',age: 20}, {name: 'john', age: 24}, {name: 'Jane', age: 30}]; $scope.checkOut = function () { var params = {"arrayOject":$scope.arrayOject}; $state.go("checkout", params); }; } }) .state('B', { params: {'arrayOject':''}, controller: function ($scope, $stateParams) { $stateParams.arrayOject; } });