将某些单词替换为输入字段 Javascript/Angular2



我有一个字符串'我喜欢橙色,蓝色,黑色,粉红色,玫瑰色,黄色,白色,黑色"。是否可以用输入字段替换黄色和黑色单词,以便我可以输入自己的颜色?

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

最新更新