如何在angular2和ionic2中同时保留组件的DOM元素和模板字符串

Posted

技术标签:

【中文标题】如何在angular2和ionic2中同时保留组件的DOM元素和模板字符串【英文标题】:How to keep both DOM elements and template string of a component in angular2 & ionic2 【发布时间】:2018-03-02 06:32:42 【问题描述】:

我使用 ionic2 & angular2 构建应用程序,我想定义一个自定义组件,如 ion-navbar,它可以在其中附加标题和按钮,就像:

<t-nav>
  <t-title>title for custom nav</t-title>
  <t-buttons></t-buttons>
</t-nav>

使用自定义组件

@Component(
  selector: 't-nav',
  template: '<div>dummy</div><div>dummy</div>'
)
export class TNav 

但是在 ionic build 之后,t-nav 中的内容不见了,只剩下了

<t-nav>
<div>dummy</div><div>dummy</div>
</t-nav>

那么谁能告诉我 angular2 框架如何在模板不为空的情况下将 DOM 元素保留在 ion-nav 和 ion-buttons 中?

ionic-angular包nav.js中的一些代码,模板好像不是空的

Navbar.decorators = [
     type: Component, args: [
                selector: 'ion-navbar',
                template: '<div class="toolbar-background" [ngClass]="\'toolbar-background-\' + _mode"></div>' +
                    '<button (click)="backButtonClick($event)" ion-button="bar-button" class="back-button" [ngClass]="\'back-button-\' + _mode" [hidden]="_hideBb">' +
                    '<ion-icon class="back-button-icon" [ngClass]="\'back-button-icon-\' + _mode" [name]="_bbIcon"></ion-icon>' +
                    '<span class="back-button-text" [ngClass]="\'back-button-text-\' + _mode">_backText</span>' +
                    '</button>' +
                    '<ng-content select="[menuToggle],ion-buttons[left]"></ng-content>' +
                    '<ng-content select="ion-buttons[start]"></ng-content>' +
                    '<ng-content select="ion-buttons[end],ion-buttons[right]"></ng-content>' +
                    '<div class="toolbar-content" [ngClass]="\'toolbar-content-\' + _mode">' +
                    '<ng-content></ng-content>' +
                    '</div>',
                host: 
                    '[hidden]': '_hidden',
                    'class': 'toolbar',
                    '[class.statusbar-padding]': '_sbPadding'
                
            ,] ,
];

html中我们也可以嵌套类似的元素

<ion-navbar>
     <button ion-button icon-only menuToggle>
       <ion-icon name="menu"></ion-icon>
     </button>

     <ion-title>
       Page Title
     </ion-title>

     <ion-buttons end>
       <button ion-button icon-only (click)="openModal()">
         <ion-icon name="options"></ion-icon>
       </button>
     </ion-buttons>
</ion-navbar>

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:
@Component(
  selector: 't-nav',
  template: '<div>dummy</div><div>dummy</div>'
)
export class TNav 

这告诉 Angular 组件的 模板 就是 &lt;div&gt;dummy&lt;/div&gt;&lt;div&gt;dummy&lt;/div&gt;。如果你想transcludet-nav里面的html元素,你需要像这样添加&lt;ng-content&gt;&lt;/ng-content&gt;

@Component(
  selector: 't-nav',
  template: `<!-- Dumy div -->
             <div>dummy</div>
             <!-- Content included beetween <t-nav>...</t-nav> -->
             <ng-content></ng-content>
             <!-- Another dummy div -->
             <div>dummy</div>`
)
export class TNav 

这将告诉 Agular 将任何 HTML 元素放在 &lt;t-nav&gt;...&lt;/t-nav&gt; 中(如 t-titlet-buttons),ng-content 所在的位置。


重要提示:就像您在 this SO answer 中看到的一样,来自 Ionic Team 的 Mark Hartington 不建议使用自定义组件作为导航栏,因为它可能会导致多个问题和错误。

【讨论】:

非常感谢,它有效!出于某种原因,我们的团队需要自定义离子导航栏的外观,也许我们可以找到另一种方法来实现这一点。 很高兴听到这个消息 :) 是的,您可以试一试,如果您发现任何问题,请告诉我们,以便我们看看如何解决这个问题...

以上是关于如何在angular2和ionic2中同时保留组件的DOM元素和模板字符串的主要内容,如果未能解决你的问题,请参考以下文章

Ionic2 + Angular2 还是 React-native? [关闭]

ionic2+angularjs2

我们如何在 ionic2/Angular2 中集成或使用 AWS API 网关 SDK

Angular2,Ionic2:如何使用 ngModel 对嵌套 *ngfor 中的单选按钮进行 2way 绑定?

如何使用gridFs将我的后端与我的前端与angular2和ionic2连接起来?

Ionic2 x Angular:导航更改时的服务重置