除非NgRoutingUsePushState设置为false,否则默认视图不会出现在index.html中。为什么?

时间:2014-03-25 23:06:36

标签: routing dart angular-dart

考虑一个简单的index.html

<body>
  <h1>Example</h1>
  <ng-view></ng-view>
...

使用以下路由初始化代码:

void routeInitializer(Router router, RouteViewFactory viewFactory) {
  viewFactory.configure({
    'hello': ngRoute(
        path: '/hello',
        view: 'view/hello.html'),
    'default': ngRoute(
        defaultRoute: true,
        path: '/default',
        view: 'view/default.html')
  });
};

访问index.html时未显示任何视图,除非我添加

  ..factory(NgRoutingUsePushState,
      (_) => new NgRoutingUsePushState.value(false))

到我的AngularModule()初始化,在这种情况下会显示默认视图(这就是我想要的)。为什么要添加此NgRoutingUsePushState配置?

2 个答案:

答案 0 :(得分:2)

这可能是onPopState模式实施的错误。例如,onHashChange在页面首次加载时不会触发事件,因此有一行来处理初始加载: https://github.com/angular/route.dart/blob/master/lib/client.dart#L652

实现此功能时onPopState确实在页面加载时触发了事件,因此不需要相同的hack,但这可能已经改变。不幸的是,目前的测试套件中没有对此进行测试。

来自:https://developer.mozilla.org/en-US/docs/Web/API/Window.onpopstate

  

浏览器倾向于在页面加载时以不同方式处理popstate事件。 Chrome和Safari总是在页面加载时发出popstate事件,但Firefox不会。

这需要仔细研究如何在Dart中处理这个问题。

待续......

更新

为route_hierarchical提交了一个修补程序:https://github.com/angular/route.dart/commit/9796e36fb0c6eee98e6754203ea5cfbb740b3121

答案 1 :(得分:1)

不需要添加NgRoutingUsePushState。我已经将下面的代码段添加到我的主控制器作为临时修复,直到错误得到解决。相关链接:https://code.google.com/p/dart/issues/detail?id=18067

import 'dart:js';
import 'dart:html';

class MainController {
  MainController(NgRoutingHelper helper) {
    Event popStateEvent = new Event.eventType('PopStateEvent', 'popstate');
    context['window'].dispatchEvent(popStateEvent);
  }
}