$urlRouterProvider คือ อะไร ?

เป็นตัวจัดการกับ URL ทุกครั้งที่มีการเรียก URL ที่กำหนดไว้ โดยมีฟังก์ชั่นที่ให้ใช้งาน 3 ฟังก์ชั่น

  • when()
  • otherwise()
  • rule()

when()

when() เป็นฟังก์ชั่นสำหรับเมื่อเราต้องการ redirect โดยมีรายละเอียดดังนี้

  • what - เป็น pathOfUrl ที่ส่งมา
  • handler - เป็น pathOfUrl ที่ต้องการ redirect ไป / ฟังก์ชั่น
.config(function($urlRouterProvider) {
  $urlRouterProvider.when(what, handler);
});

กรณีที่ handler เป็นฟังก์ชั่นจะสามารถ return ค่าได้ 3 ลักษณะ

  • False - เพื่อระบุให้ $urlRouter ไม่ตรงกับ ที่กำหนดไว้ โดย $urlRouter จะไปหา state ที่ถูกต้อง ใช้เพื่อระบุว่าผู้ใช้เข้าใช้ได้ถูก URL
  • String (URL) - จะทำการ redirect ไปที่ URL ดังกล่าว
  • True/Undefinded - เพื่อระบุให้ $urlRouter รู้ว่ากำลังใช้งาน URL ดังกล่าว

otherwise()

otherwise() เป็นฟังก์ชั่นที่ใช้ในกรณีที่ URL ไม่ถูกต้อง otherwise จะทำการ redirect ไปยัง url ที่เราต้องการ

.config(function($urlRouterProvider){
    // otherwise use for invalid route
    $urlRouterProvider.otherwise('/index');

    // Advance otherwise
    $urlRouterProvider.otherwise(function($injector, $location){
        ... some advanced code...
    });

rule()

rule() เป็นฟังก์ชั่นที่ใช้ในการกำหนด custom routing ก่อนที่จะไปเช็คกับ routing อื่นๆ ที่กำหนดไว้

.config(function($urlRouterProvider){
 	$urlRouterProvider.rule(function($injector, $location) {
		return '/index';
	});

ทำการสร้าง state ไว้ 3 state

.config(function ($stateProvider, $urlRouterProvider) {
	$stateProvider
		.state('one', {
			url: '/one',
			template: '<p>this is state one</p><p ui-view></p>'
		})
		.state('one.two', {
			url: '/two',
			template: '<p>this is state one-two</p>'
		})
		.state('three', {
			url: '/three',
			template: '<p>this is state three</p>'
		});
});

กำหนด otherwise ให้เมื่อกรอก url ไม่ถูกต้องให้ส่งกลับมาที่ state one

.config(function ($stateProvider, $urlRouterProvider) {
	$urlRouterProvider.otherwise('/one');
	
	$stateProvider
		.state('one', {
			url: '/one',
			template: '<p>this is state one</p><p ui-view></p>'
		})
		.state('one.two', {
			url: '/two',
			template: '<p>this is state one-two</p>'
		})
		.state('three', {
			url: '/three',
			template: '<p>this is state three</p>'
		});
});

สามารถดูตัวอย่างผลลัพธ์ได้ที่นี่ Demo

สังเกตได้ว่า กรณีที่ URL ไม่ตรงกับ state ไหนเลย จะทำการ redirect ไปยัง state one