gpt4 book ai didi

angular - 基于值的动态模板而不是带有 ngTemplateOutlet 的变量

转载 作者:太空狗 更新时间:2023-10-29 17:31:31 25 4
gpt4 key购买 nike

我正在尝试模拟一组动态问题。想想一个测验,其中一个问题是多项选择,第二个是单选题,第三个是是不是……等等。

使用 Angular 4.1,我认为使用 ngTemplateOutlet 进行模板化是实现这一目标的最佳方式,我的想法是我可以将所有复选框的样式设置为相同,所有单选按钮都设置为相同等。

@Component({
selector: 'my-component',
template: `
<div *ngFor="let item of items">
<ng-template [ngTemplateOutlet]="item.type" [ngOutletContext]="{ item: item }"></ng-template>
</div>`
})
export class MyComponent {
@Input() items: any[];
}

@Component({
selector: 'my-app',
template: `
<div>
<my-component [items]="questions">
<ng-template #question let-item="item">{{item?.question}}</ng-template>
<ng-template #check let-item="item">checkboxes here {{item?.type}} - {{item?.values}}</ng-template>
<ng-template #radio let-item="item">radio buttons here{{item?.type}} - {{item?.values}}</ng-template>
<ng-template #bool let-item="item">boolean here{{item?.type}} - {{item?.values}}</ng-template>
<ng-template #textbox let-item="item">textbox here{{item?.type}} - {{item?.values}}</ng-template>
</my-component>
</div>`
})
export class App {
@ViewChild('question') question;
@ViewChild('type') type;
@ViewChild('values') values;
questions = [
{ question: "my checkbox question", type: "check", values: ["checkbox1","checkbox2","checkbox3","checkbox4"] },
{ question: "my radiobutton question", type: "radio", values: ["radio1","radio2","radio3","radio4"] } ,
{ question: "my boolean question", type: "bool", values: ["yes", "no"] } ,
{ question: "my textbox question", type: "textbox", values: ["maybe something maybe nothing"] }
];

我已经 created this plunker as a proof of concept努力,但它不起作用。所有代码都在 src/app.ts 文件中。

我想要的是这样的:

My checkbox question?
checkbox 1, checkbox2, checkbox3

my radio button question
radiobutton1, radiobutton2, radiobutton3

my boolean question?
yes, no

如何修改此代码以使用变量的值来指示要使用的模板?

最佳答案

正如我在评论中所说,您必须为 ngTemplateOutlet 属性传递 TemplateRef。可以这样做:

@Directive({
selector: 'ng-template[type]'
})
export class QuestionTemplate {
@Input() type: string;
constructor(public template: TemplateRef) {}
}

app.html

<my-component [items]="questions">
<ng-template type="question" ...>...</ng-template>
<ng-template type="check" ...>...</ng-template>
...

my.component.ts

@Component({
selector: 'my-component',
template: `
<div *ngFor="let item of items">
<ng-template
[ngTemplateOutlet]="dict['question']"
[ngOutletContext]="{ item: item }"></ng-template>
<ng-template
[ngTemplateOutlet]="dict[item.type]"
[ngOutletContext]="{ item: item }"></ng-template>
</div>`
})
export class MyComponent {
@Input() items: any[];

@ContentChildren(QuestionTemplate) templates: QueryList<QuestionTemplate>;

dict = {};

ngAfterContentInit() {
this.templates.forEach(x => this.dict[x.type] = x.template);
}
}

Plunker Example

关于angular - 基于值的动态模板而不是带有 ngTemplateOutlet 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com