【问题标题】:Angular 2 and one-way binding from the client to the backendAngular 2 和从客户端到后端的单向绑定
【发布时间】:2017-03-22 15:59:45
【问题描述】:

如果我使用方括号,绑定会像这样从后端传递到客户端。

<div>
  <span>Name</span>
  <input type="text" placeholder="Konrad" [value]="name">
</div>

我想要完全相反的,要么单向到后面,要么至少双向绑定。我已经尝试了以下两种方法,但都没有将前面的更改传达给后面的私有字段。

<div>
  <span>Name</span>
  <input type="text" placeholder="Konrad" (change)="name">
</div>

<div>
  <span>Name</span>
  <input type="text" placeholder="Konrad" [(change)]="name">
</div>

我错过了什么?

目的是让输入框为空(因此显示占位符的值),并且一旦用户输入内容,就可以访问后面的值。

我想我可以使用标记并通过@viewChild 引用组件。我也可以在 (change)=updateName($event) 上触发一个事件,但在我看来,这两者都有些老套,而不是最佳实践。

【问题讨论】:

    标签: angular typescript binding


    【解决方案1】:

    使用[(ngModel)] 而不是[(change)]

    <div>
      <span>Name</span>
      <input type="text" placeholder="Konrad" [(ngModel)]="name">
    </div>
    

    这提供了双向绑定。这意味着输入字段将显示name的值,但同时在用户输入字段时更新name

    在组件中初始化name='';,就会有你想要的效果了。

    如果需要触发函数nameChanged(),加ngModelChange

    <div>
      <span>Name</span>
      <input type="text" placeholder="Konrad" [(ngModel)]="name" (ngModelChange)="nameChange()">
    </div>
    

    参考:https://angular.io/docs/ts/latest/guide/template-syntax.html#!#event-binding(搜索 ngModel)

    【讨论】:

    • 哦,所以ngModel实际上是一个特定的东西?我认为这只是一个通用变量或事件名称。现在我觉得很愚蠢......这是在哪里声明的?我查看了我的所有代码,没有这样的东西。是保留字还是什么?
    • @KonradViltersten 是的,ngModelngModelChange 都是保留字。
    • 还没有。在我回复您进行跟进之前,我正在尝试不同的事情(当然是出于对您的帮助的尊重)。我收到消息 未处理的承诺拒绝:模板解析错误:无法绑定到“ngModel”,因为它不是“输入”的已知属性。 "
      我确实已经声明了后场testOnly="qqq" 并尝试了testOnly: string = "www" 等。完全输了。
  • 知道了。我必须添加import { FormsModule } from '@angular/forms'; imports: [...FormsModule]。现在可以了!
  • 猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多