我在用天使dart 和布线.我的视图是包含单个组件的一行程序.我觉得这些观点并没有起到应有的作用.我可以直接布线到元件吗?


Example:

router.root
  ..addRoute(
      name: 'welcome',
      path: '/welcome',
      defaultRoute: true,
      enter: view('views/welcome.html'))
  ..addRoute(
      name: 'camera',
      path: '/camera',
      enter: view('views/camera.html'));

And here's 100

<welcome></welcome>

And here's 100

<camera></camera>

如你所见,这些观点是相当软弱的.我更愿意说:"当你进入一个视图时,插入这个组件."

这有可能吗?

推荐答案

我也想问同样的问题,但是你是第一个!我找到了一个解决方案,可能不是最好的,但至少它是有效的.

我为所有路由创建了一个html:

dyn_view.html:

<div><dynamic-view></dynamic-view></div>

当然还有一个组件动态视图,它从路由提供者获取实际的组件标记名,并使用这里描述的技术动态添加到DOM中:How to add a component programatically in Angular.Dart?

dynamic_view.html

<div></div>

dynamic_view.dart

@NgComponent(
    selector: 'dynamic-view',
    templateUrl: 'view/dynamic_view.html'
)
class DynamicView implements NgShadowRootAware {
  Compiler compiler;
  Injector injector;
  String elementName;

  DynamicView(this.compiler, this.injector, RouteProvider provider) {  
    elementName = provider.parameters["elementName"];
  }

  void onShadowRoot(ShadowRoot shadowRoot) {
    DivElement inner = shadowRoot.querySelector("div");
    inner.appendHtml("<$elementName></$elementName>");    
    BlockFactory template = compiler(inner.nodes);
    var block = template(injector);
    inner.replaceWith(block.elements[0]); 
  }
}

现在是路由.元素名称必须以某种方式传递给RouteProvider.我受到这个帖子的启发:Verifying route preconditions prior to loading controller

class DynamicViewFactory {
  ViewFactory viewFactory;
  DynamicViewFactory(this.viewFactory);

  call(String elementName) {
     return (RouteEvent event) {
       event.parameters["elementName"] = elementName;
       viewFactory("view/dyn_view.html")(event);
     };
  }
}



class MyRouteInitializer implements RouteInitializer {

  init(Router router, ViewFactory view) {
    DynamicViewFactory dynView = new DynamicViewFactory(view);
    router.root
      ..addRoute(
          name: 'route1',
          path: '/a/:b',
          enter: dynView('componentA'))
      ..addRoute(
          name: 'route2',
          path: '/b/:c',
          enter: dynView('componentB'));
  }
}

上面的代码与我实际使用的代码略有不同,因此可能会有一些小错误,但总体思路是一样的.

希望有帮助!

Dart相关问答推荐

如何扩展 Dart 套接字 BroadcastStream 缓冲区大小为 1024 字节?

浮动操作按钮:如何像 RaisedButton 一样更改启动 colored颜色 和突出显示 colored颜色 ?

Flutter tabview刷新问题

如何保存 List 并使用 Hive 检索?

如何使用 Android aar 文件构建 Flutter 项目?

如何使用Flutter在按钮网格中滑动(swipe)/拖动(drag) 2 个或更多按钮

Flutter ButtonRow 填充

如何使用Flutter dio 下载文件?

自定义声音推送通知不起作用

不要将 PageView 居中 - Flutter

停止音频循环(audioplayers 包)

从Dart中的另一个文件导入扩展名方法

设置Dart中非常量的默认值

如何左对齐 Flutter 中的 OutlineButton 图标

在 Flutter 的 TextFormField 中管理事件

什么是健全的编程语言?

从dart语言列表中过滤空值的最佳方法是什么

dart中是否可以有一个私有构造函数?

dart中的动态和对象有什么区别?

字符串枚举