2016-06-04 4 views
0

У меня есть форма, которая выглядит, как это в шаблонеangular2 `ngControlGroup` внутри компонента детского

<form [ngFormModel]="form"> 
    <div ngControlGroup="contents"> 
    <div ngControlGroup="title"> 
     <div *ngFor="let lang of languages$ | async" [ngControlGroup]="lang"> 
     <md-input ngControl="content"></md-input> 
     </div> 
    </div> 
    </div> 
</form> 

и форма выглядит как этот

this.form = this.builder.group({ 
    contents: this.builder.group({ 
    title: this.builder.group({ 
     en: this.builder.group({ 
     id: this.builder.control(null), 
     content: this.builder.control('some english content') 
     }), 
     cs: this.builder.group({ 
     id: this.builder.control(null), 
     content: this.builder.control('some czech content') 
     }) 
    }) 
    }) 
}); 

, и я хотел бы поставить

<div ngControlGroup="contents"> 
    <div ngControlGroup="title"> 
    <div *ngFor="let lang of languages | async" [ngControlGroup]="lang"><!-- --></div> 
    </div> 
</div> 

часть в компонент, который будет выглядеть следующим образом

<form-contents-item type="title" [languages]="languages$ | async"> 
    <md-input ngControl="content"></md-input> 
</form-contents-item> 

и его шаблон, как этот

<div ngControlGroup="contents"> 
    <!-- `title` from @Input --> 
    <div [ngControlGroup]="title"> 
    <!-- `languages` from @Input --> 
    <div *ngFor="let lang of languages" [ngControlGroup]="lang"> 
     <!-- content projection here, probably using `ngTemplateOutlet`, since you can't iterate over ng-content --> 
    </div> 
    </div> 
</div> 

Но проблема в том, что ngControlGroup должен быть ребенок либо ngForm или ngFormModel, и так же ngControl на этом входе, что я буду проецировать с template. Итак, вопрос в том, как я могу сделать эту работу? Поделитесь экземпляром form с моим form-contents-item, вероятно, будет работать только для группы, а не для самого входа? Так что-то еще?

ответ

0

Просто создайте нормальный компонент и совместите его с ngModel, выполнив ControlValueAccessor.

+0

Я не совсем, видя, как это что поможет:/Я могу сделать компонент совместимым с 'ngModel' в порядке, но это работает только для' ngControl', а не 'ngControlGroup', правильно? Итак, какая часть этого будет решена? – foxx

+0

Какова цель использования компонента в качестве контрольной группы? Я не думаю, что это поддерживается. –

+0

Мне не нужен компонент как ControlGroup, я просто не хочу делать этот бит с 'ngControlGroup =" содержимым "и" ngControlGroup = "title" и 'ngFor' DRY, поскольку единственное, что изменилось бы это «название». Поэтому я подумал, что сделаю компонент, передам ему часть «title» и сделаю это. Но это не сработает, потому что 'ngControlGroup' должен быть дочерним элементом' ngForm'. – foxx

0

Я столкнулся с подобной проблемой, и мне нужно было установить контрольную группу на дочернем компоненте, получить доступ к управляющей группе через инъекцию конструктора в дочернем компоненте, а также установить ngFormModel в шаблоне.

шаблон Родитель:

<form-contents-item [ngControlGroup]="content" type="title" [languages]="languages$ | async"> 
    <md-input ngControl="content"></md-input> 
</form-contents-item> 

Детский шаблон:

<div [ngFormModel]="contents"> 
     <!-- `title` from @Input --> 
     <div [ngControlGroup]="title"> 
     <!-- `languages` from @Input --> 
     <div *ngFor="let lang of languages" [ngControlGroup]="lang"> 
      <!-- content projection here, probably using `ngTemplateOutlet`, since you can't iterate over ng-content --> 
     </div> 
     </div> 
</div> 

Edit: contents бы имя свойства, которое присваивается впрыскиваемого controlGroup в form-contents-item

+0

Да, это то, что я закончил делать, но это только решает первую часть проблемы, а другое - когда вы пытаетесь использовать '' или '[ngTemplateOutlet]', что также нарушает «привязку». – foxx

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