如何使用 es6 模板文字作为 Angular 组件输入

How to use es6 template literal as Angular Component Input

在我的 Angular 4 应用程序中,我有一个接受字符串输入的组件:

<app-my-component [myInput]="'some string value'"></app-my-component>

在某些情况下我需要在字符串中传递一个变量,例如:

<app-my-component [myInput]="'My name is ' + name + '!'"></app-my-component>

如果我可以使用 es6 template literals(又名 模板字符串back-tick 字符串)就好了:

<app-my-component [myInput]="`My name is ${name}!`"></app-my-component>

但它不起作用:

Uncaught Error: Template parse errors: Parser Error: Unexpected token Lexer Error: Unexpected character [`] at column 1 in expression

完成它的正确方法是什么?

ES6 Template literals (Template strings) cannot be used inside an Angular component input, because the Angular compiler 不懂这个语法。

你提供的方式很好

<app-my-component [myInput]="'My name is ' + name + '!'"></app-my-component>

或者类似这样的东西,

在组件中,

// In the component, you can use ES6 template literal
name: string;
input: string;
    
ngOnInit() {
  this.name = 'Dinindu';
  this.input = `My name is ${this.name}!`;
}

在HTML,

<app-my-component [myInput]="input"></app-my-component>

也可以这样使用。它真的很接近模板文字,

<app-my-component myInput="My name is {{name}}"></app-my-component>

您仍然可以在属性值中使用 angular 的插值语法:

myInput="My name is {{ name }}!"

这取决于你喜欢写什么,但不幸的是绑定表达式中不允许反引号。

只要模板存在于 TS 源而不是 HTML 中,就可以使用模板文字表达式。所以下面不工作

<app-my-component [myInput]="`My name is ${name}!`"></app-my-component>

但下面的方法会起作用

let displayString: String = 'I work in a string literal - ';

@Component({
  selector: 'app-product-alerts',
  template: `
    ${displayString} Tada !!
  `,
  styleUrls: ['./product-alerts.component.css']
})

如果您想探索实时代码,这里有一个示例: https://stackblitz.com/edit/angular-qpxkbd-urdema?file=src%2Fapp%2Fproduct-alerts%2Fproduct-alerts.component.ts