2013-05-06 67 views
4

我已經開始嘗試使用Dart和Route包http://pub.dartlang.org/packages/routeDart和http://pub.dartlang.org/packages/route

兩個問題都拿出了立刻道:

1)是否有可能(如果有什麼習慣的方法)來定義一個備用路由,當用戶點瀏覽器是不應該存在的URL(例如通過給出一個假散列片段)。在示例代碼中,路由框架僅引發了一個ArgumentError("No handler found for $path")

2)飛鏢編輯器不在根路徑/上提供已編譯的應用程序,但是在從文件系統目錄派生的路徑下。這使得測試路由框架成爲可能。是否有可能根據localhost:3030/提交申請?

+1

1)從外觀上看,服務器端有一個'defaultStream',但是我沒有在客戶端看到你所提到的。也許提出一個錯誤? – 2013-05-06 19:09:26

回答

1

1)我不知道有這樣做的好方法。你可以聽每個URL,然後手動檢查$路徑匹配其他一些網址,但還有點兒凌亂(*):

var homeUrl = new UrlPattern(r'/home'); 
var contactUrl = new UrlPattern(r'/contact'); 

var router = new Router() 
    ..addHandler(new url.UrlPattern(r'(.*)'), matchPages) 
    ..listen(); 

void matchPages(String path) { 
    if(homeUrl.matches(path)) { 
    // Handle home page display 
    } else if(contactUrl.matches(path)) { 
    // Contact page 
    } else { 
    // No match, handle it how you wish 
    } 
} 

這將是很好有一個建在移交默認路由的方式客戶。

2)Justin Fagnani(Route包的作者)points out您可以從單獨的web服務器(即不是由Dart Editor提供的應用程序)爲您的應用程序提供服務,也可以使用與文件系統路徑匹配的路徑:(。*)#文章將無論URL是localhost:3030 /#文章還是C:/ Dart/app/web/out /#文章,都能正確匹配文章。在Github上有這個問題:https://github.com/dart-lang/route/issues/31

2

對於第2點:
您可以使它像下面嗎? :
url的可變部分由'window.location.pathname'設置;

library urls; 

import 'dart:html'; 
import 'package:route/client.dart'; 

final String _pathName = window.location.pathname; 

final UrlPattern _base = new UrlPattern("${_pathName}"); 
final UrlPattern home = new UrlPattern("${_pathName}#home"); 
final UrlPattern page2 = new UrlPattern("${_pathName}#page2"); 

// useFragment: true is important! allow keep '#" un url 
// allow to bookmark be valid when browser is closed and reopen. 
final Router router = new Router(useFragment: true) 
     // simple hack to redirect/to /#home (home UrlPattern) 
     ..addHandler(_base, (_) => window.location.hash = "#home"); 

main() { 
    router..addHandler(home, showHome) 
     ..addHandler(page2, showPage2) 
     ..listen(); 
} 

void showHome(String path) { 
    query("body").children 
      ..clear() 


    ..add(new Element.html("<h1>Home</H1>")); 
} 

void showPage2(String path) { 
    query("body").children 
      ..clear() 
      ..add(new Element.html("<h1>Page2</H1>")); 
}