sintaxis estructurales directivas data crear angular typescript angular2-directives

data - directivas estructurales angular



¿Cuándo utilizar corchetes[] en las directivas @Inputs y cuándo no? (3)

Cuando usa [] para enlazar con un @Input() , es básicamente una expresión de plantilla.

De la misma manera, mostrar {{abc}} no mostraría nada (a menos que en realidad tuviera una variable llamada abc ).

Si tiene una cadena @Input() , y desea @Input() a una cadena constante, puede [myText]=" ''some text'' " así: [myText]=" ''some text'' " , o en pocas palabras, como un atributo HTML normal: myText="some text" .

La razón por la que [myEnabled]="true" funcionó es porque true es una expresión de plantilla válida que, por supuesto, se evalúa como true boolean.

Estoy un poco confundido.

Vea esta sencilla directiva:

@Directive({ selector: ''[myDirective]'' }) export class MyDirective { private text: string; private enabled: boolean; @Input() myDirective:string; @Input(''myText'') set myText(val: string) { this.text = val; } @Input(''myEnabled'') set myEnabled(val: boolean) { this.enabled = val; } ngOnInit() { console.log("myDirective string: " + this.myDirective); console.log("myText string: " + this.text); console.log("myEnabled boolean: " + this.enabled); } }

si mi html se verá así:

<div [myDirective]="myDefaultText" [myEnabled]="true" [myText]="abc"></div>

La salida será:

myDirective string: myDefaultText real value // good myEnabled boolean: true // good myText string: undefined // Why?

Si myText el [] de myText :

<div [myDirective]="myDefaultText" [myEnabled]="true" myText="abc"></div>

La salida será:

myDirective string: myDefaultText real value // good myEnabled boolean: true // good myText string: abc // GOOD

También puedo eliminar el [] de myEnabled y también funcionará. Así que aquí está mi confusión: cuando necesito usar corchetes [] y cuando no, mientras que el usuario que va a usar myDirective nunca tendrá que preguntarse si o no, creo que los corchetes [] siempre deberían estar ahí. ¿No lo son?


Los paréntesis le dicen a Angular que evalúe la expresión de la plantilla. Si omite los corchetes, Angular trata la cadena como una constante e inicializa la propiedad de destino con esa cadena. ¡No evalúa la cuerda!

No cometas el siguiente error:

<!-- ERROR: HeroDetailComponent.hero expects a Hero object, not the string "currentHero" --> <hero-detail hero="currentHero"></hero-detail>

revise: https://angular.io/docs/ts/latest/guide/template-syntax.html#!#property-binding


binding [] es para objetos, sin él el valor es una cadena. Ten cuidado con los tipos.

En el codigo

<div [myDirective]="myDefaultText" [myEnabled]="true" [myText]="abc"></div>

ha intentado enlazar el objeto, pero el objeto no está disponible, por lo tanto, su valor undefined está undefined . Por otro lado, si elimina el enlace, el objeto desaparece, solo tiene un valor de string asignado a la propiedad.