我已经开始尝试使用Dart和Route包http://pub.dartlang.org/packages/route。
立即出现了两个问题:
1)当用户将浏览器指向不应该存在的URL时(例如,通过给出错误的散列片段),是否有可能(以及什么是惯用方式)定义回退路由。在示例代码中,路由框架只引发ArgumentError("No handler found for $path")
。
2)dart编辑器不在根路径/
处提供已编译的应用程序,而是在从文件系统目录派生的路径下提供服务。这使得测试路径框架成为可能。是否可以在localhost:3030/
下面提供应用程序?
答案 0 :(得分: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>"));
}
答案 1 :(得分:1)
1)我不知道有什么好办法。你可以监听每个网址(。*),然后手动检查$ path是否与其他网址匹配,但这有点混乱:
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你可以从一个单独的网络服务器(即不是Dart编辑器提供的服务器)提供你的应用程序,或者使用一个与文件系统匹配的路由路径:(。*)#article将正确匹配文章,无论URL是localhost:3030 /#article还是C:/ Dart / app / web // out /#article。在Github上有一个未解决的问题:https://github.com/dart-lang/route/issues/31