【问题标题】:angular2-mdl: Break layout in components does not workangular2-mdl:组件中的中断布局不起作用
【发布时间】:2017-01-25 18:51:40
【问题描述】:

对于来自演示应用http://mseemann.io/angular2-mdl/layout的给定布局

<div class="demo-container" mdl-shadow="2">
<mdl-layout mdl-layout-fixed-header mdl-layout-header-seamed>
  <mdl-layout-header>
     <mdl-layout-header-row>
        <mdl-layout-title>Title</mdl-layout-title>
        <mdl-layout-spacer></mdl-layout-spacer>
        <!-- Navigation. We hide it in small screens. -->
        <nav class="mdl-navigation mdl-layout--large-screen-only">
           <a class="mdl-navigation__link" href>Link</a>
           <a class="mdl-navigation__link" href>Link</a>
           <a class="mdl-navigation__link" href>Link</a>
        </nav>
     </mdl-layout-header-row>
  </mdl-layout-header>
  <mdl-layout-drawer>
     <mdl-layout-title>Title</mdl-layout-title>
     <nav class="mdl-navigation">
        <a class="mdl-navigation__link" href>Link</a>
        <a class="mdl-navigation__link" href>Link</a>
        <a class="mdl-navigation__link" href>Link</a>
     </nav>
  </mdl-layout-drawer>
  <mdl-layout-content>
     <router-outlet ></router-outlet>
  </mdl-layout-content>

如果我直接在 app.html 中复制粘贴,但如果我将其分解为可重用的组件,它会起作用。比方说:

<div class="demo-container" mdl-shadow="2">
<mdl-layout mdl-layout-fixed-header mdl-layout-header-seamed>
  <header-comp></header-comp>
  <drawer-comp></drawer-comp>
<mdl-layout-content>
     <router-outlet ></router-outlet>
</mdl-layout-content>

其中&lt;header-comp&gt;&lt;/header-comp&gt;&lt;drawer-comp&gt;&lt;/drawer-comp&gt; 封装了部分布局标记(分别为&lt;mdl-layout-header&gt;...&lt;/mdl-layout-header&gt;&lt;mdl-layout-drawer&gt;...&lt;/mdl-layout-drawer&gt;

两个组件都没有在原地渲染任何东西

我正在运行 Angular2“2.0.0”(全新的官方最终版本)和 angular-mdl“1.7.1”,并将 Webpack 作为模块捆绑器。可以说,在 router-outlet 中渲染的所有 angular2-mdl 指令都正确渲染。这导致认为 angular2-mdl 已正确导入和安装。

更具体地说,在app.module.ts

@NgModule({
    imports: [  
        CommonModule,
        FormsModule,
        homeRouting,
        MdlModule
    ],

header.tsdrawer.ts

    providers: [
        MdlLayoutComponent
    ]

最后,如果我将我的一个可重用组件(比如说:&lt;header-comp&gt;&lt;/header-comp&gt;)移出标记(见下文)。尽管布局看起来损坏(如预期的那样),但模板内容已正确呈现

<header-comp></header-comp>    
<div class="demo-container" mdl-shadow="2">
     <mdl-layout mdl-layout-fixed-header mdl-layout-header-seamed>
     <drawer-comp></drawer-comp>
     <mdl-layout-content>
         <router-outlet ></router-outlet>
</mdl-layout-content>

我可以使用普通的 mdl 或复制代码来解决它,但是……发生了什么?

干杯

【问题讨论】:

    标签: angular angular2-mdl


    【解决方案1】:

    mdl-layout-headermdl-layout-drawermdl-layout-content 组件在mdl-layout 中用作@ContentChild。如果它们不是 mdl-layout 的直接子代,则 Angular 将找不到它们。事实上他们是undefined,你什么也看不到。 (原因是mdl html结构不同,需要重构)。

    如果我正确理解您要做什么:请从您的 header-comp 中删除 mdl-layout-header 组件,并将 mdl-layout-header 组件保留为 mdl-layout 的直接子组件 - 以这种方式:

    <mdl-layout mdl-layout-fixed-header mdl-layout-header-seamed>
       <mdl-layout-header>
          <header-comp></header-comp>
       </mdl-layout-header
       <mdl-layout-content>
         <router-outlet ></router-outlet>
       </mdl-layout-content>
    </mdl-layout>
    

    对于mdl-layout-drawermdl-layout-content,您需要这样做。

    【讨论】:

    • 好吧!,它就像一个魅力。现在我了解了在将 MDL 标记应用于子模块时遇到的一些意外行为。非常感谢!!你用 angular-mdl 做得很好! ......只是为了理解它:谁应该重组你的意思“错误”的 mdl html?,你还是 mdl 团队?
    • 不,不。重组是由 angular2-mdl 完成的 :) 我需要再记录一下...
    • @michael - 我在同一个组件中有 mdl-layout-drawer 和 mdl-layout-header ,因为它们具有共同的功能。正如您在这个答案中所说,mdl-layout-drawer 和 mdl-layout-header 必须是 mdl-layout 的直接子级,这是否意味着不可能将它们放在同一个组件中?如果我想像这样构造我的代码,是否有解决方法或者我需要回到常规 mdl?
    • 嗨,我有一个关于这个的问题。就像@michael 所说的“mdl-layout-header、mdl-layout-drawer 和 mdl-layout-content 在 mdl-layout 中用作 ContentChild”。我应该如何使用 EventEmitter 从子 传递事件,因为在这种情况下 将表现得像孙子。我正在尝试将事件从抽屉发送到包含 mdl-layout 但它不起作用的组件。
    猜你喜欢
    • 2017-09-09
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2018-02-16
    • 2017-01-29
    • 2017-09-09
    相关资源
    最近更新 更多