我一直在角度(版本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。篡夺角度数据绑定有什么问题,比如我的例子?
2。什么是更好的选择?
答案 0 :(得分:1)
没有任何内在错误(除了从视图中调用私有方法)。但大多数情况下,表单用于收集信息,然后在提交时对其执行操作。因此,简单地将表单控件绑定到模型是有意义的。
有几种选择:
ngModel
),并且除了将字段简单地绑定到task.startDate
之外,还可以使用(ngModelChange)
来对模型更改做出反应,并且从而处理日期。或者你可以使用setter而不是public字段,从而在setter内部完成工作valueChanges
observable,以便在每次更改值时收到通知,从而处理日期。答案 1 :(得分:0)
我没有发现您的解决方案有任何问题。
我认为使用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;
}