การใช้งาน $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 ไว้ 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;
        }
    });