我有一个Angular4应用程序,它从表单中捕获数据并存储在DynamoDB中。它使用ngModel来支持双向数据绑定,并且在显示器上看起来都很好。问题起作用,因为输入字段被键入为“文本”绑定到Typescript'number'字段。似乎是将对象值的类型更改为“string”。我只是将HTML输入类型更改为“数字”,除了表单字段上不必要的和不需要的增量/减量装饰器(隐藏它们似乎有限的支持)。所以我很好奇是否有另一种方法可以保持数据结构按需要输入...如果这是ngModel中的错误...或者输入类型只需要'数字'。
我的sample.component.ts文件中的结构如下所示:
export class Course {
Id: number;
Name: string;
}
...
courseInstance: Course;
saveCourse() {
JSON.stringify(this.courseInstance);
}
我的sample.component.html文件如下所示:
<div>
<label for="courseid">Course ID: </label>
<input type="text" class="form-control"[(ngModel)]="courseInstance.Id" name="courseid">
</div>
<div>
<label for="courseName">Course Name: </label>
<input type="text" class="form-control"[(ngModel)]="courseInstance.Name" name="courseName">
</div>
<div>
<button type="button" class="btn btn-info btn-lg" (click)="saveCourse()">Save</button>
</div>
JSON.stringify(this.courseInstance)的输出会产生类似
的内容{"Id":"100","Name":"Test course"}
注意值100表示为字符串。
如果我不使用表单,只需创建一个实例,如
courseInstance: Course = {
Id: 100,
Name: 'Test course'
};
然后输出JSON.stringify(courseInstance)的结果;我得到了
{"Id":100,"Name":"Test course"}
如果我尝试使用PutItem在DynamoDB中存储对象,则当数据来自HTML表单时,Id值将无法进行类型检查。
我原以为在Typescript中打字会优先于HTML'text'输入类型。
答案 0 :(得分:1)
将类型text
更改为number
以生成类型number
,并且不要写信。
<input type="number" class="form-control"[(ngModel)]="courseInstance.Id" name="courseid">
答案 1 :(得分:0)
Angular目前不支持属性绑定和事件绑定中的类型检查。正如你在这里看到的,他们的github中存在一个未解决的问题: https://github.com/angular/angular/issues/16952
我建议您将输入更改为类型编号并在组件中添加此css:
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
编辑:在Stackblitz中添加一个应用程序: https://stackblitz.com/edit/angular4-ngmodel-changes-type-of-data-from-number-to-string
答案 2 :(得分:0)
[(ngModel)]
语法只能设置数据绑定属性。如果您需要做更多或不同的事情,可以编写扩展表格。
<div>
<label for="courseid">Course ID: </label>
<input type="text" #ref class="form-control" [ngModel]="courseInstance.Id" (ngModelChange)="onDataChange(ref.value)"name="courseid">
</div>
ngModel
数据属性设置元素的value属性,ngModelChange
事件属性侦听元素值的变化。use parseInt以获得所需的结果。
ngModelChange
将针对您需要去抖动值的每次击键触发,否则每次按键都会发出事件。若要去抖动值,您可以使用Subject
debounceTime()
运算符。{{1} }既是subject
又是observable
。这意味着您可以将其视为可观察对象并将值传递给它。除此之外,使用Template reference variable
在您的组件中
observer