【问题标题】:How to process input data between view and model in angular如何以角度处理视图和模型之间的输入数据
【发布时间】:2018-08-15 05:17:42
【问题描述】:

我已经在 Angular(5.2 版)中工作了几个月,感觉好像我一定错过了一些相当明显的东西。我的问题是我需要在视图和模型之间对我的数据进行操作。

例如,我正在构建一个与 Microsoft 项目交互的简化应用程序。最终用户只需输入每个任务的开始和结束日期。根据我的组件中存在的其他一些因素,它可能会直接更新模型的开始/结束日期(+-额外天数)或更改该任务中的另一个变量。所以使用

<input type="date" [(task.startDate)] />

不太合适。我的解决方案是使用类似

<input type="date" (change)="processTheDate($event.value, task)" [value]="task.startDate" >


private processTheDate(value: Date, task: Task){

     //do some proccessing

     //set the value
     task.startDate = value;
}

根据我在网上看到的,这不是preferred solution

我的问题实际上是双重的。

1.在我的示例中篡夺 Angular 的数据绑定有什么问题?

2。有什么更好的选择?

【问题讨论】:

  • 我还应该指出,我的示例非常简化,用于解释我的问题。这是一个在 Angular 开发过程中已经发生过好几次的问题。

标签: angular typescript


【解决方案1】:
  1. 没有什么本质上是错误的(除了从视图调用私有方法)。但大多数时候,表单用于收集信息,然后在提交时对其进行处理。所以简单地将表单控件绑定到模型是有意义的。

  2. 有几种选择:

    • 您可以使用基于模板的表单(即ngModel),除了简单地将字段绑定到task.startDate 之外,还可以使用(ngModelChange) 对模型更改做出反应,从而处理日期。或者您可以使用 setter 而不是公共字段,从而在 setter 内部完成工作
    • 您可以使用响应式表单,并订阅 FormControl 的 valueChanges observable,以便在每次值更改时收到通知,从而从那里处理日期。

【讨论】:

  • 感谢您的回答,很高兴看到我没有做任何奇怪的事情。我确实玩过一些反应形式,但我发现它们有点复杂和不灵活(这是我刚开始的时候,所以我可能会重新审视它们)。
  • 从视图访问私有方法还有什么问题?它工作正常,所以我假设视图有点像组件的成员,因此允许访问它。
  • 它在 JIT 模式下工作正常。一旦您使用 --prod 标志(或只是 -aot 标志)为生产构建,它就不再存在了。视图是组件的客户端:它访问其字段。 AOT 编译器将视图编译为 TypeScript 类。 TypeScript 类不能访问另一个类的私有字段。
  • 啊,是的,这是有道理的。我想我可能需要重新配置一些东西才能获得有效的生产版本。与 jit 相比,aot 快了多少,我一直在运行实时测试(没有 prod)并且到目前为止加载时间非常好。
  • 我已将 Angular 直接集成到我的后端(MVC 5)中,并且所有内容都立即上升。这开始看起来像是一种糟糕的做事方式,所以我可能需要重组,角度部分到它自己的项目>>使用 prod 构建>>将静态文件插入 MVC 后端
【解决方案2】:

我认为您的解决方案没有任何问题。

我认为使用ngModel 通常更适合双向绑定,因为您不必编写多次同步值的代码。但是,如果您需要在值更新时执行大量逻辑,则使用change 是完全可以的。

您也可以混合使用它们,以防您希望在值更改时执行一些逻辑时保持双向绑定。

<input type="date" (change)="onStartDateChange($event.value, task)" 
       [(ngModel)]="task.startDate" >

onStartDateChange(value: Date, task: Task){

     //do some proccessing

     //set the value
     task.startDate = value;
}

【讨论】:

  • 感谢您的回复。就像 JB Nizet 的回答一样,绑定和更改事件的两种方式可能更简洁一些。任何想法,如果它是更好的性能明智,看到它是用一个绑定完成的?
  • 我认为在性能方面它们非常相似。 ngModel 针对双向绑定进行了优化,但支持很多不同的场景。如果你想深入了解,可以在这里阅读 ngModel 的源代码:github.com/angular/angular/blob/5.2.7/packages/forms/src/….
  • 我同意,根据我的经验,它们看起来非常相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2019-07-14
相关资源
最近更新 更多