【问题标题】:Angular - [(ngModel)] vs [ngModel] vs (ngModel)Angular - [(ngModel)] vs [ngModel] vs (ngModel)
【发布时间】:2018-02-17 15:08:56
【问题描述】:

我目前了解[(ngModel)]="expression" 是从组件到视图的双向绑定,反之亦然。我也明白[ngModel]="expression" 是单向绑定(我相信从组件到视图?)。然后有(ngModel)="expression"的可能性。我对[ngModel](ngModel) 之间的区别感到很困惑。有人可以解释一下吗?

编辑: 在玩弄并查看了@Rohan Fating 提供的文档 sn-p 之后,我意识到像 (ngModel) 这样的东西应该采用语句,而不是表达式。话虽如此,是否有合适的时间使用 (ngModel) 之类的东西,或者在任何情况下都可以使用?

【问题讨论】:

  • 它是一种方式绑定到另一种方式
  • 嘿,my answer 有什么不清楚的地方吗?
  • 不,感谢您的解释。这正是我想知道的!
  • @mbucks,太好了,祝你好运

标签: angular angular2-template angular2-ngmodel


【解决方案1】:

这个语法:

[(ngModel)]="expression"

被编译器解包成

[ngModel]="expression" (ngModelChange)="expression=$event"

意思是:

  1. 有一个 ngModel 指令应用于元素(输入)
  2. 此 ngModel 指令通过 ngModel 绑定采用 expression 参数
  3. 有一个输出(事件)ngModelChange

现在您可以看到 [ngModel] 部分始终存在,正如您所指出的,它将同步值。

当您指定(ngModel)="c()" 时会发生什么很有趣。通常,(...) 语法用于事件。因此,Angular 确实将其识别为事件并在 component view factory 中创建适当的侦听器:

function (_v, en, $event) {
    var ad = true;
    var _co = _v.component;
    ...
    if (('ngModel' === en)) {
        var pd_4 = (_co.c() !== false);
        ad = (pd_4 && ad);
    }
    return ad;
}

但是,所有(...) 元素也被解析为属性,因此它将匹配ngModel 指令选择器:

selector: '[ngModel]:not([formControlName]):not([formControl])'

所以 Angular 也会将 ngModel 指令类初始化为指令。但是,由于它没有通过[...] 语法定义的任何输入绑定,因此在更改检测期间将跳过此指令。而且由于事件ngModel 也没有为ngModel 指令定义,因此使用(ngModel) 将没有副作用并且毫无意义。

【讨论】:

    【解决方案2】:

    [(ngModel)] 是双向绑定 (NgModel) 是一种将视图绑定到组件的方式 [ngModel] 是绑定组件查看的一种方式

    【讨论】:

    • 我在上面编辑了我的问题。我尝试使用(ngModel)="exampleObj.foo",但意识到它并没有像我期望的那样绑定到我的组件上的对象。
    【解决方案3】:

    [( 在 Angular 中表示双向数据绑定。从理论上讲,您只能绑定到一个事件 ((ngModel)) 或一个值 ([ngModel])。这使您能够以与即将发生的变化不同的方式处理下降的变化。有了 Angular 2,您就有了这种灵活性。

    您需要像我在下面那样进行 ngModelChange 事件并更新值

    Plunker 链接:https://plnkr.co/edit/RZMgM69doSHGBG1l16Qf?p=preview

    @Component({
      selector: 'my-app',
      template: `
        <div>
        <input [ngModel]='value' (ngModelChange)='setModel($event)'/>
          <h2>Hello {{name}}</h2>
        </div>
      `,
    })
    export class App {
      name:string;
      value: string = '';
      constructor() {
        this.name = `Angular! v${VERSION.full}`
      }
    
      setModel(value) {
        this.value = value;
      }
    
    }
    

    【讨论】:

    • 那么(ngModel) 会被视为事件绑定吗?意思是用户输入的数据,我想阅读他们输入的内容?而如果我使用[ngModel],我只想更改用户看到的值,但他们无法影响该值?
    • 添加了屏幕截图,您可以从 angular.io 引用此链接 ::: angular.io/guide/template-syntax#binding-syntax-an-overview
    • 在测试了(ngModel)="expression" 之后,我意识到它没有将输入的值添加到我的组件中的模型中。这是因为ngModel 不被视为事件吗?
    • 我的问题也不一定与绑定有关,与[ngModel](mgModel) 的细节有关。 (ngModel) 还能用吗?
    • 用代码更新答案,我们需要为事件绑定绑定 ngModelChange 事件,但 [ngModel] 应该始终存在。模型更改将需要对输入的更改执行一些操作。
    猜你喜欢
    • 2018-12-31
    • 2015-03-03
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多