【问题标题】:Dart and http://pub.dartlang.org/packages/routeDart 和 http://pub.dartlang.org/packages/route
【发布时间】:2013-05-06 15:49:04
【问题描述】:

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

立即提出两个问题:

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

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

【问题讨论】:

  • 1) 从外观上看,服务器端有一个“defaultStream”,但我在客户端没有看到你提到的。也许会引发错误?

标签: routes dart


【解决方案1】:

对于第 2 点:
你可以让它像follow一样吗? :
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>"));
}

【讨论】:

    【解决方案2】:

    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 包的作者)points out,您可以从单独的网络服务器(即不是 Dart 编辑器提供的服务器)为您的应用程序提供服务,也可以使用与文件系统路径匹配的路由好吧:(.*)#article 将正确匹配文章,无论 URL 是 localhost:3030/#article 还是 C:/Dart/app/web//out/#article。 Github 上有一个未解决的问题:https://github.com/dart-lang/route/issues/31

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2014-08-06
      • 2012-03-12
      • 1970-01-01
      相关资源
      最近更新 更多