2016-05-22 3 views
1

В Angular2 односторонняя привязка к атрибуту name для группы радиовходов не работает. Например:Angular2: привязка к имени входного радио не работает

<div [ngFormModel]="form"> 
    <input type="radio" [name]="varName" [id]="id1" ngControl="r1"> 
    <input type="radio" [name]="varName" [id]="id2" ngControl="r2"> 
    <input type="radio" [name]="varName" [id]="id3" ngControl="r3"> 
</div> 

При загрузке страницы имя не является атрибутом ни на одном из этих радиовходов.

ответ

3

Я предполагаю, что @Schippie написал правильно. Используйте

[attr.name]="name" 

вместо

[name]="name" 

(его Plunker было несколько проблем)

Plunker example

+0

Юп жаль был до обеда, и я тоже его обнаружил. Исправлены ошибки. Одна вещь, которая запутывает, хотя для людей, которые только начинают использовать угловые, заключается в том, что использование '[name] =" variable "' работает с некоторыми элементами в некоторых условиях, но не всегда. Поэтому кажется, что всегда стоит использовать '[attr.name]'. Если вы хотите, чтобы он тоже отображался на элементе –

+0

Это не обязательно проблема с угловатой. Некоторые свойства (например, 'htmlFor' элемента' label') не имеют то же имя, что и атрибут ('for'), на который они отражены. То, что вызвано Angular, заключается в том, что иногда есть директивы, применяемые к элементам, у которых есть вход с тем же именем, что и атрибуты, но они не отражаются на атрибутах без использования '[attr.name]', но это по соображениям производительности. Обновление атрибутов дорого, потому что они меняют DOM и могут даже вызвать реинжиниринг. –

+0

Я ожидаю, что Angular предоставит поддержку IDE, чтобы иметь возможность увидеть, применяются ли директивы в конечном итоге. Было принято много проектных решений, чтобы обеспечить отличную поддержку IDE. –

1

Если это работает как привязка к свойству select, свойство name будет установлено в элементе javascript dom. Значение, пока оно не отображается в представлении, которое фактически было установлено на элементе HTMLElement.

Что иллюстрирована следующим шлепнуть:

import {Component} from '@angular/core' 
import {ControlGroup, Control} from '@angular/common' 

@Component({ 
    selector: 'my-app', 
    providers: [], 
    template: ` 
    <form [ngFormModel]="group"> 
     <input type="radio" [attr.name]="name" ngControl="test"> 
     <input type="radio" [attr.name]="name" ngControl="test2" ref-example> 
     <input type="radio" [name]="name" ngControl="test3" ref-exampletwo> 
     <p>using [attr.name]: {{example.name | json }}</p> 
     <p>using [name]: {{exampletwo.name | json }}</p> 
    </form> 
    ` 
}) 
export class App { 
    name: "test" 
    group: ControlGroup 

    constructor() { 
    this.group = new ControlGroup({ 
     test: new Control(""), 
     test2: new Control(""), 
     test3: new Control("") 
    }) 
    } 
} 

http://plnkr.co/edit/xHkgb0BgPzZLwyFpTo1W?p=preview

То, что вы на самом деле хотите сделать следующее:

[attr.name]="name"

Это позволит установить свойство на элемент.

+1

'' FORM_DIRECTIVES' и FORM_PROVIDERS' доступны по всему миру и не должны быть предоставлена. '...' в 'директивах' и' провайдеры' является избыточным. Почему вы вводите 'FormBuilder', но затем используете' new ControlGroup (...) '. Вместо этого используйте 'formBuilder.group (...) '. –

+0

Ваш ответ был удален, поэтому я разместил свой собственный. Я прилагаю к этому некоторое усилие, чтобы заставить Plunker работать, поэтому я не хочу его удалять. –

+1

Хороший вопрос о директивах формы/провайдерах не знал о том, что я обычно ввожу поставщиков в бутстрап и директивы там, где это необходимо. Хорошо знать. Будет модифицировать код, чтобы отразить это. И формообразователь просто лениво копировал конструктор в моем собственном коде. –

Смежные вопросы