Angular 2 ngModel конвертировать из строки в объект

У меня есть сущность машинописи, которую я хочу показать в форме:

class Data {
    constructor(public message: string, public properties: Object) {

    }
}

Примером этого будет

{
    message: "Hello",
    properties:{
        a: 2,
        b: 3    
    }
}

Я хочу показать properties в компоненте ввода в виде строки "a=2;b=3" и проанализировать пользовательский ввод этого поля для объекта, и у меня уже есть логика, чтобы сделать это.

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

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

1 ответ

Почему бы вам не использовать входные данные для всех изменяемых полей с двусторонним связыванием (даже созданным динамически) и собирать строку на лету при изменении любого поля?

Например, вот так: Компонент.html:

<div>
    <label for="message">message:</label>
    <input [(ngModel)]="model.message" id="message" (input)="computeProps()" />
    <br/>

    <label for="propertyes_a">properties.a:</label>
    <input [(ngModel)]="model.properties.a" id="propertyes_a" (input)="computeProps()" />
    <br/>

    <label for="propertyes_a">properties.b:</label>
    <input [(ngModel)]="model.properties.b" id="propertyes_b" (input)="computeProps()" />
    <br/>

    <span>The object's current values:</span>
    <pre>
    {{ model | json }}
  </pre>
    <span>Computed properties:</span><br/>
    <span>{{ computedProps }}</span>
</div>

Компонент.ts:

import { Component, OnInit } from '@angular/core';
import { FormsModule } from '@angular/forms';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
    model = { message: 'Hello', properties: { a: 2, b: 3 } };
    computedProps = '';

    ngOnInit() {
        this.computeProps(); // set initial value on load
    }

    computeProps() {
        this.computedProps = `a=${this.model.properties.a};b=${this.model.properties.b}`;
    }
}

Также вам необходимо импортировать FormsModule в модуль:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';

import { AppComponent } from './app.component';

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        FormsModule
    ],
    providers: [],
    bootstrap: [AppComponent]
})
export class AppModule { }

Похоже, значения меняются по мере ввода

Другие вопросы по тегам