【问题标题】:Angular 4 Variable TemplatingAngular 4 变量模板
【发布时间】:2018-04-16 20:46:19
【问题描述】:

大家好,我制作了一个 Angular 4 应用程序,并且我有我的组件:Contentholder。 Contentholder 只是一些 HTML 和 CSS,用于显示我正在使用的内容持有者。

当我使用<content-holder></content-holder> 时,它可以正常工作并向我显示内容持有者。

但是当我这样使用它时:

<content-holder> 
    <div>
        <h2>{{ translationservice.getExpression("Kiosk.Markforgotten_Text") }}</h2>
        <p>{{ translationservice.getExpression("Kiosk.Markforgotten_Subtext") }}</p>
    </div> 
</content-holder>`

它只是向我显示了 Contentholder,“content-holder”括号之间的所有内容都被抛在了后面。

如何使用 contentholder 组件并将我自己的 HTML 从我正在使用的页面中放入其中?不只是复制和粘贴。这就是我尝试将 contentholder 设为组件的原因。

----------更新---------- ---

当我这样使用它时:

<content-holder>
<ng-content>
    <div>
        <h2>{{ translationservice.getExpression("Kiosk.Markforgotten_Text") }}</h2>
        <p>{{ translationservice.getExpression("Kiosk.Markforgotten_Subtext") }}</p>
    </div>
</ng-content>

我得到这个错误:

    Uncaught Error: Template parse errors:
<ng-content> element cannot have content. ("

<content-holder>
    [ERROR ->]<ng-content>
        <div>
            <h2>{{ translationservice.getExpression("Kiosk.Markforgotten"): ng:///AppModuleShared/ForgotMarkComponent.html@3:4
    at syntaxError (compiler.es5.js:1689)
    at TemplateParser.parse (compiler.es5.js:12801)
    at JitCompiler._compileTemplate (compiler.es5.js:26846)
    at compiler.es5.js:26766
    at Set.forEach (<anonymous>)
    at JitCompiler._compileComponents (compiler.es5.js:26766)
    at compiler.es5.js:26653
    at Object.then (compiler.es5.js:1679)
    at JitCompiler._compileModuleAndComponents (compiler.es5.js:26652)
    at JitCompiler.compileModuleAsync (compiler.es5.js:26581)

【问题讨论】:

  • 您是否收到错误消息?
  • 不,没有错误!它只是不显示我在 contentholder 括号之间抛出的 HTML
  • 这是完全正常和预期的。 将显示 content-holder 组件的模板。不是开始标签和结束标签之间的内容。如果要在组件的模板内显示标签内的内容,则需要在组件的模板内使用
  • 那是如何工作的?我将我的 div 放在 之间,但我收到一条错误消息,告诉我 ng-content 元素不能有内容 [my div and h2,p]
  • @MexLataster 你能说明你在哪里使用ng-content吗?

标签: angular


【解决方案1】:

如果我对您的问题的理解正确,听起来您正在尝试不正确地使用 ng-content

这就是 ng-content 在 Angular 4 中的工作方式:

组件:

@Component({
    selector: 'wrap',
    template: `
        <div class="wrap">
            <ng-content>
        </div>
    `
})
export class WrapComponent {}

用法:

<wrap>
    <h1>Hello world</h1>
<wrap>

结果:

<div class="wrap">
    <h1>Hello world</h1>
</div>

尝试实现该用法,您的问题应该会消失。


以下是您的组件的示例:

组件:

@Component({
    selector: 'content-holder',
    template: `
        <div class="content-holder">
            <ng-content>
        </div>
    `
})
export class ContentHolderComponent {}

用法:

<content-holder> 
    <div>
        <h2>{{ translationservice.getExpression("Kiosk.Markforgotten_Text") }}</h2>
        <p>{{ translationservice.getExpression("Kiosk.Markforgotten_Subtext") }}</p>
    </div> 
</content-holder>

结果:

<div class="content-holder"> 
    <div>
        <h2>some value</h2>
        <p>some value</p>
    </div> 
</div>

【讨论】:

    【解决方案2】:

    您将&lt;ng-content&gt; 放入将接受嵌入内容的组件中。像这样:

    content-holder.component.ts

    @Component({
      selector: 'content-holder',
      template: `<ng-content></ng-content>`,
      styleUrls: ['./content-holder.component.css'],
    })
    export class ContentHolder {}
    

    app.component.ts

    @Component({
      template:`
      <content-holder>
        <div> My content</div>
      </content-holder>
      `,
    })
    export class AppComponent  {}
    

    还可以查看此answer,了解更多具有多个插槽和现场演示的&lt;ng-content&gt; 高级用例。

    【讨论】:

    • 非常感谢您的帮助!
    • 如果您觉得我的答案有用,请考虑支持我的答案 :) 如果可以,请对已接受的答案做同样的事情。
    • 已经这样做了!但我的意见并不重要,因为我的分数少于 15 分哈哈哈
    猜你喜欢
    • 2018-07-14
    • 2018-12-26
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2017-09-07
    • 2018-05-26
    相关资源
    最近更新 更多