textarea的ngModel不在angular2中工作

Bhu*_*kar 25 html javascript json angular

我正在尝试使用textarea打印json对象ngModel.

我做了以下事情:

<textarea style="background-color:black;color:white;" [(ngModel)]='rapidPage' rows="30" cols="120">                             
</textarea>
Run Code Online (Sandbox Code Playgroud)

我想在textarea中加载json对象.上面的代码是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
    };
Run Code Online (Sandbox Code Playgroud)

我想将数据加载为字符串.任何输入?

Ank*_*ngh 24

假设您希望按rapidPage原样绑定,并且只在textArea中编写有效的JSON.

  • 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');
    };
  }
Run Code Online (Sandbox Code Playgroud)

模板用法:

<textarea style="background-color:black;color:white;" [(ngModel)]='rapidPageValue' rows="30" cols="120">                             
</textarea>
Run Code Online (Sandbox Code Playgroud)


小智 11

要在Angular 2中绑定textarea值,您可以使用change-function:

模板

<textarea id="some-value" (change)="doTextareaValueChange($event)">{{textareaValue}}</textarea>
Run Code Online (Sandbox Code Playgroud)

零件

export class AppComponent implements OnInit {
  private textareaValue = '';
  doTextareaValueChange(ev) {
    try {
      this.textareaValue = ev.target.value;
    } catch(e) {
      console.info('could not set textarea-value');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Has*_*ani 8

<textarea class="form-control" 
          name="message"
          rows="8"
          [(ngModel)]="Obj.message"
          #message='ngModel'
          ></textarea>
Run Code Online (Sandbox Code Playgroud)

对于双向绑定,您只需要在textarea标签中添加属性name="message",仅[(ngModel)]可100%使用!

  • 很好的答案。有点奇怪,但显然如果没有 `name` 属性,`[(ngModel)]` 东西就不能工作。- 话虽如此,我发现您的答案中的 `#message='ngModel'` 有点令人困惑,因为这似乎没有必要,而且似乎没有任何区别。 (3认同)
  • 在我添加 name 属性之前,我的文本区域 [formControl] 绑定不起作用。谢谢! (2认同)

Ana*_*kzz 8

ngModel 工作如果

  1. 它周围有一个表单,文本区域添加了一个名称属性。

如果没有,您可以使用以下语法来达到相同的效果

<textarea [value]="strVariableInComponent" (input)="strVariableInComponent = $event.target.value;"></textarea>
Run Code Online (Sandbox Code Playgroud)


win*_*mao 5

除非您真的想要在两者之间进行同步,否则您通常会在完成 json 编辑后实现一个按钮来保存/应用更改。如果是这种情况,您的渲染很容易。

<textarea #textbox>{{ rapidPage | json }}</textarea>
Run Code Online (Sandbox Code Playgroud)

确保上面的行之间没有其他空格或返回字符。

然后是一个传统的按钮,例如。

<a (click)="updateRapidPage(textbox.value)">Apply</a>
Run Code Online (Sandbox Code Playgroud)

我发现这在某些情况下比残酷更好[(rapidPage)]

您还可以@ViewChild('textbox') input在组件内部使用来访问此变量。