【问题标题】:ngModel will not render on input from stringngModel 不会在来自字符串的输入上呈现
【发布时间】:2019-06-20 13:18:30
【问题描述】:

这是我的最终目标:

我正在尝试从 JSON 文件呈现输入字段。这是一个示例字符串:

{ “身份证”:1, "value": "人生的答案是:(INPUT FIELD HERE WITH ngModel)。更多内容..." }

(如果没有 Stack 将其删除,则无法输入输入字段,但输入字段当然会被输入)

现在,我确实让输入字段显示为 innerHTML 并使用安全管道清理 HTML,但 ngModel 被忽略。当我控制台记录表单结果时,没有两种方式绑定发生。我想也许我需要在加载视图后重新渲染字段,但我不知道如何实现。 (模糊)之类的其他东西也被完全忽略了。

我真的希望有人知道如何做到这一点。我的 JSON 文件将只有一个值,其中包含大量 HTML 标记和多个输入字段。

我的项目是一个 ionic3 应用程序。

【问题讨论】:

  • 有一些方法可以动态编译角度模板,但我认为这不是可取的方法,因为这意味着您的数据将包含不正确的部分角度模板。
  • 您的数据应该只是数据,而角度模板只是帮助您呈现数据的代表性部分。
  • @AmirArbabian 我绝对理解你在说什么,但这对我来说可能不是一个选择。正如我所说,这些 JSON 文件中有很多输入字段。它基本上是一个工作簿应用程序,用户可以在内容的所有地方填写空白。也许还有另一种方法?也许像拆分输入字段一样?不确定,但我必须让它这样工作......
  • 好的,你能在stackblitz上创建一个这个问题的虚拟例子吗?我会研究一下并尝试找出一些东西
  • @AmirArbabian 是的,谢谢。这是一个快速的 stackblitz 示例:stackblitz.com/edit/ionic-dhdtk4

标签: javascript angular ionic-framework ionic3


【解决方案1】:

编辑后的帖子

Angular 组件、指令、事件和属性绑定仅适用于静态添加到组件模板的 HTML。

使用 [innerHTML]="..." 您可以将 HTML 添加到 DOM,但 Angular 不会关心它包含什么 HTML,除了清理。

最好的选择是在运行时使用组件模板编译 HTML。

话虽如此,我已经按照本文末尾提到的参考资料创建了一个演示应用程序。这将满足您的要求

https://stackblitz.com/edit/dynami-template-ionic

代码如下

home.ts

import {Compiler, Component, NgModule, OnInit, ViewChild,
  ViewContainerRef} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {FormsModule} from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html'
})
export class App implements OnInit {
  @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;

  constructor(private compiler: Compiler) {}
  section={}
  ngOnInit() {
    this.addComponent(`<p>Sed ut perspiciatis unde omnis <input type="text" [(ngModel)]="section.answer1" name="answer1"/> sit voluptatem accusantium doloremque laudantium.</p><p>Totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt <input type="text" [(ngModel)]="section.answer2" name="answer2"/>`,
      {
        section:this.section,
        increaseCounter: function () {
          this.counter++;
        }
      }
    );
  }

  submitAnswers(answers){
    console.log(answers);
  }

  private addComponent(template: string, properties: any = {}) {
    @Component({template})
    class TemplateComponent {}

    @NgModule({imports: [ FormsModule ],declarations: [TemplateComponent]})
    class TemplateModule {}

    const mod = this.compiler.compileModuleAndAllComponentsSync(TemplateModule);
    const factory = mod.componentFactories.find((comp) =>
      comp.componentType === TemplateComponent
    );
    const component = this.container.createComponent(factory);
    Object.assign(component.instance, properties);
    // If properties are changed at a later stage, the change detection
    // may need to be triggered manually:
    // component.changeDetectorRef.detectChanges();
  }
}

home.html

<ion-header>
  <ion-navbar>
    <ion-title>Home</ion-title>
  </ion-navbar>
</ion-header>

<ion-content padding>
<h1>Dynamic template:</h1>
<h2>Workbook</h2>
  <form (ngSubmit)="submitAnswers(section)">
  <div #container></div>
  <h3>This input below is hard coded in the view and works perfectly. Inputs from string are ignored.</h3>
    <input type="text" [(ngModel)]="section.answer3" name="answer3">
    <br />
    <p><em>** Answers are logged in console **</em></p>
    <button ion-button type="submit" block>Submit Answers</button>
  </form>
</ion-content>

参考文献

How can I use/create dynamic template to compile dynamic Component with Angular 2.0?

https://stackoverflow.com/a/39507831/6617276

https://stackoverflow.com/a/46918940/6617276

【讨论】:

  • 嘿抱歉,但这不是我要找的。您的示例是将整个 JSON 字符串放入一个输入字段中。我在一个字符串中有多个输入字段,它们需要呈现为单独的输入字段,并且每个输入字段都有 2 路绑定正常工作。我在这里创建了一个 stackblitz 示例,说明我所拥有的以及问题所在:stackblitz.com/edit/ionic-dhdtk4
  • 我已经编辑了帖子并提供了不同的解决方案。希望对您有所帮助。
  • Rathnakara!你太聪明了!我真的非常感谢你......这直接完美。 :D 我将其作为正确答案进行了检查,但我的赞成票尚未显示,因为我是 Stackoverflow 的新用户。
  • 嘿Rathnakara!我为 Angular 9 和 10 重新提出了这个问题。如果你有机会,你介意检查一下吗?这将非常有帮助! stackoverflow.com/questions/63162578/…
猜你喜欢
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
相关资源
最近更新 更多