mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-19 19:57:22 +08:00
Basic router
This commit is contained in:
187
ionic/components/app/test/barkpark/main.js
Normal file
187
ionic/components/app/test/barkpark/main.js
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
import {bootstrap} from 'angular2/core'
|
||||||
|
import {For, Component, Template, Parent} from 'angular2/angular2'
|
||||||
|
import {FormBuilder, Validators, FormDirectives, CongrolGroup} from 'angular2/forms';
|
||||||
|
|
||||||
|
import {Log} from 'ionic2/util'
|
||||||
|
import {Router} from 'ionic2/routing/router'
|
||||||
|
|
||||||
|
import {List, Item, NavViewport, View, Button, Input, Tabs, Tab, Content, NavPane, Aside} from 'ionic2/ionic2'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'login-page'
|
||||||
|
})
|
||||||
|
@Template({
|
||||||
|
url: 'pages/login.html',
|
||||||
|
directives: [View, FormDirectives, Button, Input]
|
||||||
|
})
|
||||||
|
export class LoginPage {
|
||||||
|
constructor( @Parent() viewport: NavViewport ) { //, fb: FormBuilder ) {
|
||||||
|
|
||||||
|
this.viewport = viewport
|
||||||
|
Log.log('LOGIN PAGE')
|
||||||
|
|
||||||
|
var fb = new FormBuilder()
|
||||||
|
|
||||||
|
this.loginForm = fb.group({
|
||||||
|
email: ['', Validators.required],
|
||||||
|
password: ['', Validators.required],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
doLogin(event) {
|
||||||
|
Log.log('Doing login')
|
||||||
|
event.preventDefault();
|
||||||
|
console.log(this.loginForm.value);
|
||||||
|
//this.viewport.push(SecondPage)
|
||||||
|
}
|
||||||
|
doSignup(event) {
|
||||||
|
this.viewport.push(SignupPage)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'signup-page'
|
||||||
|
})
|
||||||
|
@Template({
|
||||||
|
url: 'pages/signup.html',
|
||||||
|
directives: [View, FormDirectives, Button, Input]
|
||||||
|
})
|
||||||
|
export class SignupPage {
|
||||||
|
constructor( @Parent() viewport: NavViewport ) { //, fb: FormBuilder ) {
|
||||||
|
|
||||||
|
this.viewport = viewport
|
||||||
|
Log.log('SIGNUP PAGE')
|
||||||
|
|
||||||
|
var fb = new FormBuilder()
|
||||||
|
|
||||||
|
this.signupForm = fb.group({
|
||||||
|
name: ['', Validators.required],
|
||||||
|
email: ['', Validators.required],
|
||||||
|
password: ['', Validators.required],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
doLogin(event) {
|
||||||
|
this.viewport.pop()
|
||||||
|
}
|
||||||
|
doSignup(event) {
|
||||||
|
Log.log('Doing signup')
|
||||||
|
event.preventDefault();
|
||||||
|
console.log(this.signupForm.value);
|
||||||
|
|
||||||
|
this.viewport.push(AppPage)
|
||||||
|
//this.viewport.push(SecondPage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-page'
|
||||||
|
})
|
||||||
|
@Template({
|
||||||
|
url: 'pages/app.html',
|
||||||
|
directives: [View, FormDirectives, Button, Input, Tabs, Tab]
|
||||||
|
})
|
||||||
|
export class AppPage {
|
||||||
|
constructor( @Parent() viewport: NavViewport ) { //, fb: FormBuilder ) {
|
||||||
|
this.viewport = viewport
|
||||||
|
this.streamTab = StreamTab
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({ selector: 'stream-tab' })
|
||||||
|
@Template({
|
||||||
|
url: 'pages/tabs/home.html',
|
||||||
|
directives: [For, View, Content, List, Item]
|
||||||
|
})
|
||||||
|
class StreamTab {
|
||||||
|
constructor(navPane: NavPane) {
|
||||||
|
this.navPane = navPane;
|
||||||
|
this.posts = [
|
||||||
|
{'title': 'Just barked my first bark'},
|
||||||
|
{'title': 'Went poopy' }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
selectPost(post) {
|
||||||
|
console.log('Select post', post);
|
||||||
|
this.navPane.push(PostDetail, {
|
||||||
|
post
|
||||||
|
}, {
|
||||||
|
transition: '3dflip'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({ selector: 'post-detail-tab' })
|
||||||
|
@Template({
|
||||||
|
url: 'pages/post/detail.html',
|
||||||
|
directives: [View, Content]
|
||||||
|
})
|
||||||
|
class PostDetail {
|
||||||
|
constructor(navPane: NavPane) {
|
||||||
|
this.navPane = navPane
|
||||||
|
this.title = 'Hello'
|
||||||
|
}
|
||||||
|
selectItem() {
|
||||||
|
this.navPane.push(PostDetailTab)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({ selector: 'splash-page' })
|
||||||
|
@Template({
|
||||||
|
url: 'pages/splash.html',
|
||||||
|
directives: [View, Content]
|
||||||
|
})
|
||||||
|
class SplashPage {
|
||||||
|
constructor(navPane: NavPane) {
|
||||||
|
window.navPane = navPane;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main app entry point
|
||||||
|
*/
|
||||||
|
@Component({ selector: '[ion-app]' })
|
||||||
|
@Template({
|
||||||
|
directives: [NavViewport],
|
||||||
|
url: 'main.html'
|
||||||
|
})
|
||||||
|
class IonicApp {
|
||||||
|
constructor() {
|
||||||
|
this.firstPage = SplashPage//AppPage//LoginPage
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
// TODO: HACK
|
||||||
|
var nav = window.navPane;
|
||||||
|
|
||||||
|
var route = new Router()
|
||||||
|
|
||||||
|
route.on('/login', (e) => {
|
||||||
|
console.log('ROUTE: Login page')
|
||||||
|
nav.push(LoginPage, {
|
||||||
|
sync: true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
route.on('/post/:id', (match) => {
|
||||||
|
console.log('ROUTE: Post page', match)
|
||||||
|
nav.push(PostDetail);
|
||||||
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
route.on('/signup', (e) => {
|
||||||
|
console.log('ROUTE: Signup page')
|
||||||
|
nav.push(SignupPage)
|
||||||
|
})
|
||||||
|
*/
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
|
console.log('IonicApp Start')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bootstrap(IonicApp)
|
||||||
|
|
3
ionic/components/app/test/barkpark/pages/splash.html
Normal file
3
ionic/components/app/test/barkpark/pages/splash.html
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<div>
|
||||||
|
<h1>BARK PARK</h1>
|
||||||
|
</div>
|
10
ionic/components/app/test/barkpark/pages/tabs/home.html
Normal file
10
ionic/components/app/test/barkpark/pages/tabs/home.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<ion-view nav-title="Stream">
|
||||||
|
<ion-content class="padding">
|
||||||
|
<h2>Posts</h2>
|
||||||
|
<ion-list>
|
||||||
|
<ion-item *for="#post of posts" (^click)="selectPost(post)">
|
||||||
|
{{post.title}}
|
||||||
|
</ion-item>
|
||||||
|
</ion-list>
|
||||||
|
</ion-content>
|
||||||
|
</ion-view>
|
99
ionic/routing/router.js
Normal file
99
ionic/routing/router.js
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
|
||||||
|
export class Router {
|
||||||
|
constructor() {
|
||||||
|
this.routes = []
|
||||||
|
|
||||||
|
//this.match();
|
||||||
|
}
|
||||||
|
|
||||||
|
match() {
|
||||||
|
let hash = window.location.hash;
|
||||||
|
|
||||||
|
// Grab the path without the leading hash
|
||||||
|
let path = hash.slice(1);
|
||||||
|
|
||||||
|
let routeParams = {};
|
||||||
|
let found = false
|
||||||
|
|
||||||
|
for(let route of this.routes) {
|
||||||
|
// Either we have a direct string match, or
|
||||||
|
// we need to check the route more deeply
|
||||||
|
// Example: /tab/home
|
||||||
|
if(route.url == path) {
|
||||||
|
found = true
|
||||||
|
} else if((routeParams = this.matchRoute(route, path))) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(found) {
|
||||||
|
route.exec(this.buildRouteParams(routeParams));
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.noMatch();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check a specific route against a given path
|
||||||
|
matchRoute(route, path) {
|
||||||
|
var parts = path.split('/');
|
||||||
|
var routeParts = route.url.split('/');
|
||||||
|
|
||||||
|
// Our aggregated route params that matched our route path.
|
||||||
|
// This is used for things like /post/:id
|
||||||
|
var routeParams = {};
|
||||||
|
|
||||||
|
if(parts.length !== routeParts.length) {
|
||||||
|
// Can't possibly match if the lengths are different
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, we need to check each part
|
||||||
|
|
||||||
|
let rp, pp;
|
||||||
|
for(let i in parts) {
|
||||||
|
pp = parts[i];
|
||||||
|
rp = routeParts[i];
|
||||||
|
|
||||||
|
if(rp[0] == ':') {
|
||||||
|
// We have a route param, store it in our
|
||||||
|
// route params without the colon
|
||||||
|
routeParams[rp.slice(1)] = pp;
|
||||||
|
} else if(pp !== rp) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return routeParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
buildRouteParams(routeParams) {
|
||||||
|
routeParams._route = {
|
||||||
|
path: window.location.hash.slice(1)
|
||||||
|
}
|
||||||
|
return routeParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
noMatch() {
|
||||||
|
// otherwise()?
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
|
on(path, cb) {
|
||||||
|
let route = new Route(path, cb);
|
||||||
|
this.routes.push(route);
|
||||||
|
this.match();
|
||||||
|
return route;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Route {
|
||||||
|
constructor(url, handler) {
|
||||||
|
this.url = url;
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
exec(matchParams) {
|
||||||
|
this.handler(matchParams)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in New Issue
Block a user