4

我已经开始试验 Dart 和 Route 包http://pub.dartlang.org/packages/route

两个问题立刻浮出水面:

1)当用户将浏览器指向一个不应该存在的url(例如,通过给出一个错误的哈希片段)时,是否有可能(如果是惯用的方式)定义一个后备路由。在示例代码中,路由框架只是引发了一个ArgumentError("No handler found for $path").

2) dart 编辑器不在根路径提供编译后的应用程序,/而是在从文件系统目录派生的路径下提供服务。这使得测试路由框架成为可能。是否可以让应用程序服务于,比如说,localhost:3030/

4

2 回答 2

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>"));
}
于 2013-07-07T21:19:17.630 回答
1

1)我不知道这样做的任何好方法。您可以侦听每个 url (.*),然后手动检查 $path 是否与其他 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 包的作者)指出,您可以从单独的网络服务器(即不是 Dart 编辑器提供的服务器)为您的应用程序提供服务,也可以使用与文件系统路径匹配的路由:(. *)#article 将正确匹配文章,无论 URL 是 localhost:3030/#article 还是 C:/Dart/app/web//out/#article。Github 上有一个未解决的问题:https ://github.com/dart-lang/route/issues/31

于 2013-05-06T22:11:21.743 回答