NgModel для текстового поля, не работающего в angular2
Я пытаюсь напечатать объект json в textarea с помощью ngModel
.
Я сделал следующее:
<textarea style="background-color:black;color:white;" [(ngModel)]='rapidPage' rows="30" cols="120">
</textarea>
Я хочу загрузить объект json в textarea. Вышеприведенный код загружает объект rapidPage
в textarea, но показывает значение textarea как [object Object]
.
объект:
this.rapidPage = {
"pageRows": [
{
"sections": [
{
"sectionRows": [
{
"secRowColumns": [
]
},
{
"secRowColumns": [
{
"colName": "users"
}
]
},
{
"secRowColumns": [
{
"colName": "sample"
}
]
}
],
"width": 0
}
]
}
],
"pageName": "DefaultPage",
"pageLayout": "DEFAULT_LAYOUT",
"editMode": true
};
Я хочу загрузить данные в виде строки.
любые входы?
Ответы
Ответ 1
Предполагая, что вы хотите привязать rapidPage
как есть, и будет писать только действительный JSON в textArea.
- Вам нужно
PARSE
при изменении значения и STRINGIFY
при показе в textarea.
PLUNKER DEMO
Выполните следующие действия в коде компонента
rapidPage = {"pageRows":[{"sections":[{"sectionRows":[{"secRowColumns":[]},{"secRowColumns":[{"colName":"users"}]},{"secRowColumns":[{"colName":"sample"}]}],"width":0}]}],"pageName":"DefaultPage","pageLayout":"DEFAULT_LAYOUT","editMode":true};
// your object
get rapidPageValue () {
return JSON.stringify(this.rapidPage, null, 2);
}
set rapidPageValue (v) {
try{
this.rapidPage = JSON.parse(v);}
catch(e) {
console.log('error occored while you were typing the JSON');
};
}
Использование шаблона:
<textarea style="background-color:black;color:white;" [(ngModel)]='rapidPageValue' rows="30" cols="120">
</textarea>
Ответ 2
Для привязки значений textarea в Angular 2 вы можете использовать функцию change:
Шаблон
<textarea id="some-value" (change)="doTextareaValueChange($event)">{{textareaValue}}</textarea>
Компонент
export class AppComponent implements OnInit {
private textareaValue = '';
doTextareaValueChange(ev) {
try {
this.textareaValue = ev.target.value;
} catch(e) {
console.info('could not set textarea-value');
}
}
}
Ответ 3
<textarea class="form-control"
name="message"
rows="8"
[(ngModel)]="Obj.message"
#message='ngModel'
></textarea>
Для двухстороннего связывания Вам просто нужно добавить атрибут в тег textarea name="message"
, ТОЛЬКО [(ngModel)]
работает на 100% !.
Ответ 4
Если вы действительно хотите синхронизировать между собой, вы обычно будете использовать кнопку, чтобы сохранить/применить изменения, когда закончите редактирование json. Если это так, ваш рендер легко.
<textarea #textbox>{{ rapidPage | json }}</textarea>
Убедитесь, что между указанной строкой не осталось другого пробела или символа возврата.
Затем традиционная кнопка, например.
<a (click)="updateRapidPage(textbox.value)">Apply</a>
Я обнаружил, что в лучшем случае это лучше, чем жестокое [(rapidPage)]
.
Вы также можете использовать @ViewChild('textbox') input
внутри компонента для доступа к этой переменной.
Ответ 5
Можете ли вы проверить это:
<textarea #textbox (change)="text = textbox.value" style="width:100%;">{{ text }}</textarea>
С уважением
Ответ 6
В соответствии с документацией [()] для двухстороннего синтаксического сахара удаляется шаблон. Какое событие вызывается при этом? Независимо, вы можете поместить вывод строки также вместе с событием в нижнем коде
Возможно, попробуйте выполнить приведенную ниже последовательность кода для вывода строки
@Directive({
selector: '[ngModel]',
host: {
"[value]": 'ngModel',
"(input)": "ngModelChange.next($event.target.value)"
}
})
class NgModelDirective {
@Input() ngModel:any; // stored value
@Output() ngModelChange:EventEmitter; = new EventEmitter() // an event emitter
}
Ответ 7
Вы можете stringify
использовать json и использовать в ngModel, как это, -
<textarea style="height:100px; width:300px;background-color:black;color:white;" [(ngModel)]='rapidPage' rows="30" cols="120">
</textarea>
ArrayDemo: Array<any> = [{"name":"pardeep","last":"jain"}]
rapidPage = JSON.stringify(this.ArrayDemo);
Рабочий пример Рабочий пример
Браузер показывает [object object]
, потому что angular не позволяет разобрать JSON, чтобы присвоить значение в ngModel, вам понадобится строка
поэтому конвертируйте это с помощью JSON.stringify