我有一个字符串'我喜欢橙色,蓝色,黑色,粉红色,玫瑰色,黄色,白色,黑色"。是否可以用输入字段替换黄色和黑色单词,以便我可以输入自己的颜色?
const a: string = 'I like orange, blue, black, pink, rose, yellow, white, black';
const b: string =['black', 'yellow'];
所以我想有这样的东西
链接是否可以使用 javascript 或 angular2 来做到这一点?..
请帮帮我...
这是完整的代码
第2部分.组件.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from '../sample02-simpleService/data.service';
@Component({
moduleId: module.id,
selector: 'part2',
template: `
<p>{{text}}</p>
<p>{{itemsSource}}</p>
`,
providers: [DataService]
})
export class Part2Component implements OnInit {
text = 'Hallo';
public itemsSource: string;
public itemsSource2: string[];
public abc: string[];
constructor(public dataService: DataService) {
}
ngOnInit() {
this.abc = this.dataService.getData3();
this.itemsSource = this.dataService.getData2();
this.itemsSource = this.itemsSource.replace(new RegExp(this.abc.join('|'), 'g'), function myFunction(){return document.write('<input>'); });
}
}
我从数据服务获取数据,所以从这里
import { Injectable } from '@angular/core';
@Injectable()
export class DataService {
getData2() {
let items3: string = 'I like orange, blue, black, pink, rose, yellow, white, black';
return items3;
}
getData3(){
let items4: string[] = ['black', 'yellow'];
return items4;
}
}
这是组件部分的代码:
a: String = 'I like orange, blue, black, pink, rose, yellow, white, black';
b: String[] = ['black', 'yellow'];
constructor() { }
ngOnInit() {
this.b.forEach(str => {
let regExp = new RegExp(str.toString(),'g');
this.a = this.a.replace(regExp, '<input/>');
});
}
上面的函数将设置您想要实现的确切 html 字符串
下一步在这里:
Inject in innerHTML angular 2
Angular 2不支持直接输入字段的注入,所以你必须点击这个链接。
更新:
了解您的要求后,我更改了实现技术并相应地更新了答案。我没有使用角管(推荐用于显示目的(,而是创建了如下简单组件
import { Component, EventEmitter, OnInit, Input, Output } from '@angular/core';
@Component({
selector: 'fill-in-blank',
template: `
<ng-container *ngFor="let text of texts; let i = index">
{{text}}<input *ngIf="i!==texts.length-1" type="text" [(ngModel)]="value[i]" (ngModelChange)="onValueChange()">
</ng-container>
`
})
export class FillInBlankComponent implements OnInit {
@Input() textline: string;
@Input() fields: string[];
@Output() valueChanged = new EventEmitter();
texts: string[];
value: string[] = [];
constructor() {}
ngOnInit() {
let regex = null;
if (this.fields && this.fields.length > 0) {
regex = new RegExp(this.fields.join("|"), 'gi');
}
this.texts = this.textline.split(regex);
}
onValueChange(index) { // Updated According to requirement
this.valueChanged.emit({ index: index, value: this.value[index] });
}
}
在您想要像这样渲染的地方使用上面的组件
<fill-in-blank [textline]="a" [fields]="b" (valueChanged)="printValue($event)"></fill-in-blank>
要构建答案数组,您需要在 ngInit
中调用以下方法。这就是您的父组件的外观
export class ParentComponent implements OnInit {
a: string = 'I like orange, blue, black, pink, rose, yellow, white, black';
b: string[] = ['blue', 'black'];
ans: string[] = [];
constructor() { }
ngOnInit() {
this.createAnswers();
}
printValue($event) {
if (this.ans[$event.index] === $event.value) {
console.log('correct input', $event);
}
}
createAnswers() {
let ansWithIndex = [];
this.b.forEach(value => {
let index = 0;
let startIndex = 0;
while ((index = this.a.indexOf(value, startIndex)) > -1) {
ansWithIndex.push({ index: index, value: value });
startIndex = index + 1;
}
});
this.ans = ansWithIndex.sort((v1, v2) => v1.index > v2.index ? 1 : -1).map(v1 => v1.value);
}
}
确保已在模块声明部分添加了FillInBlankComponent
。