[英]Value is assigned to object as a string even though it is a strongly typed
我在我的代码中看到了一些奇怪的东西。 在下面的这个例子中,我有一个(change)
事件,它获取用户在下拉菜单中选择的当前值。
<div style="padding-right: 0; width: 100%;">
<label style="width: 100%;">
<select
[(ngModel)]="courseContentButtonSelectedEvent"
class="course-content-sidebar-form-control"
(change)="setCourseContentButtonEventStep($event)"
>
<option
*ngFor="let courseContentButtonEvent of courseContentButtonEventList"
[value]="courseContentButtonEvent.id"
[selected]="courseContentButtonEvent.id == courseContentButtonSelectedEvent"
>{{ courseContentButtonEvent.value }}</option
>
</select>
</label>
</div>
它调用方法setCourseContentButtonEventStep 。
setCourseContentButtonEventStep(event: Event): void {
const courseContentButtonEventType: CourseContentButtonEventType = ((event.target as HTMLInputElement)
.value as unknown) as CourseContentButtonEventType;
let courseContent = JSON.parse(JSON.stringify(this.courseContent));
this.courseContent = CourseContentService.setCourseContentButtonEventStep(
courseContent,
courseContentButtonEventType,
this.selectedCourseContentUid,
this.selectedCourseElementUid,
this.courseContentButtonEventIndex
);
this.store.dispatch(builderActions.setCourseContent({ courseContent: courseContent }));
}
然后调用CourseContentService中的setCourseContentButtonEventStep方法。
static setCourseContentButtonEventStep(
courseContent: ICourseContent[],
courseContentButtonEventType: CourseContentButtonEventType,
selectedCourseContentUid: string,
selectedCourseElementUid: string,
courseContentButtonEventIndex: number
): ICourseContent[] {
for (let i = 0; i < courseContent.length; i++) {
if (courseContent[i].uid === selectedCourseContentUid) {
for (let j = 0; j < courseContent[i].button.length; j++) {
if (courseContent[i].button[j].uid === selectedCourseElementUid) {
for (let k = 0; k < courseContent[i].button[j].event.length; k++) {
if (k == courseContentButtonEventIndex) {
courseContent[i].button[j].event[k].action = courseContentButtonEventType;
}
}
}
}
}
}
return courseContent;
}
现在奇怪的是,尽管我选择了courseContentButtonEventType
,但它还是作为字符串而不是数字添加到了我的 object 中。 例如,看下面的数据 object,在button -> event -> action
下,具体是"action": "4"
:
[
{
"id": 1,
"uid": "card-HJUI9b9Nre",
"body": {
"text": "Testing"
},
"type": 0,
"button": [
{
"uid": "button-4WhgDe8mhe",
"title": "Get Started",
"event": [
{
"id": 1,
"action": 5,
"value": "https://en.wikipedia.org/wiki/Educational_technology"
},
{
"id": 2,
"action": "4"
}
],
"isEnabled": true
}
],
"audio": {
"uid": "audio-NIiH1fCkqd",
"url": "https://s3.eu-west-2.amazonaws.com/media.example.co.uk/default/testing_startup_ideas.mp3"
}
}
]
我认为您可以简单地使用 ngValue 而不是 value 来清理它。
<select
[(ngModel)]="courseContentButtonSelectedEvent"
class="course-content-sidebar-form-control"
(ngModelChange)="setCourseContentButtonEventStep($event)"
>
<option
*ngFor="let courseContentButtonEvent of courseContentButtonEventList"
[ngValue]="courseContentButtonEvent"
[selected]="courseContentButtonEvent.id == courseContentButtonSelectedEvent"
>{{ courseContentButtonEvent.value }}</option
>
</select>
注意使用 ngValue 而不是 value。 Value 始终是一个字符串,而 ngValue 可以保存一个 object (这基本上是你想要的)。
还要注意使用 (change) 与 (ngModelChange) 的区别
setCourseContentButtonEventStep(courseContentButtonEventType: CourseContentButtonEventType): void {
let courseContent = JSON.parse(JSON.stringify(this.courseContent));
this.courseContent = CourseContentService.setCourseContentButtonEventStep(
courseContent,
courseContentButtonEventType,
this.selectedCourseContentUid,
this.selectedCourseElementUid,
this.courseContentButtonEventIndex
);
this.store.dispatch(builderActions.setCourseContent({ courseContent: courseContent }));
}
然后我们的事件可以被大规模清理。
我还要注意一件事。 您在事件处理程序中的类型是“CourseContentButtonEventType”。 这是预期的吗? 那是你列表中的项目吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.