模板中的Angular 2 hashtags是什么意思?

ack*_*ser 113 html javascript html5 typescript angular

我正在使用角度2,我发现了类似的东西

<input #searchBox (keyup)="search(searchBox.value)"
Run Code Online (Sandbox Code Playgroud)

它的工作原理.

但是,我不明白#searchBox的含义.我在文档中也没有发现任何明确的内容.

谁能向我解释它是如何工作的?

谢谢

Har*_*rry 138

它是Angular 2模板系统中使用的语法,它将dom元素声明为变量.

在这里,我给我的组件一个模板网址

import {Component} from 'angular2/core';

@Component({
   selector: 'harrys-app',
   templateUrl: 'components/harry/helloworld.component.html'
})

export class HarrysApp {}
Run Code Online (Sandbox Code Playgroud)

模板呈现HTML.在模板中,您可以使用数据,属性绑定和事件绑定.这与以下sytax完成:

# - 变量声明

() - 事件绑定

[] - 财产约束

[()] - 双向属性绑定

{{ }} - 插值

* - 结构指令

#语法可以声明局部变量名它引用DOM的模板对象.例如

 <span [hidden]="harry.value">*</span>
 <input type="text" #harry>
 {{ harry.value }}
Run Code Online (Sandbox Code Playgroud)

  • 工作示例:`&lt;input #bla style =“ display:none;” value =“ Foo” / &lt;div&gt; {{bla.value}} &lt;/ div&gt;`。Foo以div显示。 (5认同)
  • 并且变量声明本身无法变量?我试图从菜单的复杂嵌套对象创建材料菜单项,这已经阻碍了我.我似乎无法动态创建dom变量.他们真的需要在dom中进行硬编码吗? (3认同)
  • 官方文档参考:https://angular.io/guide/template-syntax#template-reference-variables--var- (3认同)

Mat*_*ins 54

当您设置此#searchBox时,您可以在您的Typescript上获得此输入

    @ViewChild('searchBox') searchBox;
    console.info(searchBox.nativeElement.value)
Run Code Online (Sandbox Code Playgroud)

编辑

添加一些示例:https: //plnkr.co/edit/w2FVfKlWP72pzXIsfsCU?p = preview


ruf*_*fin 24

来自angulartraining.com:

模板引用变量是一个小宝石,它允许使用Angular完成许多好的事情.我通常将该功能称为"hashtag语法",因为它依赖于一个简单的hashtag来创建对模板中元素的引用:

<input #phone placeholder="phone number">
Run Code Online (Sandbox Code Playgroud)

上述语法的作用相当简单:它创建了对输入元素的引用,  稍后可以在我的模板中使用它.请注意,此变量的范围是定义引用的整个HTML模板.

这是我如何使用该引用来获取输入的值,例如:

<!-- phone refers to the input element --> 
<button (click)="callPhone(phone.value)">Call</button>
Run Code Online (Sandbox Code Playgroud)

请注意,  phone  指的是输入的  HTMLElement对象实例  .因此,  手机  具有任何HTMLElement的所有属性和方法(id,name,innerHTML,value等)

以上是避免使用ngModel或其他类型的数据绑定的简单方法,这在验证方面不需要太多.


这也适用于组件吗?

答案是肯定的!

...最好的部分是我们获得了对实际组件实例HelloWorldComponent的引用,因此我们可以访问该组件的任何方法或属性(即使它们被声明为私有或受保护,这是令人惊讶的) :

@Component({
  selector: 'app-hello',
  // ...

export class HelloComponent {
   name = 'Angular';
}
Run Code Online (Sandbox Code Playgroud)

[...]

<app-hello #helloComp></app-hello>

<!-- The following expression displays "Angular" -->
{{helloComp.name}}
Run Code Online (Sandbox Code Playgroud)

  • “即使它们被声明为私有或受保护,这也令人惊讶” - 请记住,访问说明符是编译时的保护,通常在代码编译和运行后不做任何事情。 (2认同)

Gün*_*uer 19

它创建一个引用的模板变量

  • 所述input如果元素是一个普通的DOM元素元件
  • 组件或指令实例,如果它是具有组件或指令的元素
  • 一些特定的组件或指令,如果它像使用#foo="bar"bar
@Directive({ // or @Component
  ...
  exportAs: 'bar'
})
Run Code Online (Sandbox Code Playgroud)

这样的模板变量可以在模板绑定或元素查询中引用

@ViewChild('searchBox') searchBox:HTMLInputElement;
Run Code Online (Sandbox Code Playgroud)