import { Component, OnInit } from '@angular/core';
import {
IonTextarea,
IonCheckbox,
IonList,
IonButton,
IonContent,
IonHeader,
IonInput,
IonTitle,
IonToolbar,
IonItem,
IonLabel,
IonRadioGroup,
IonRadio,
IonDatetimeButton,
IonDatetime,
IonModal
} from '@ionic/angular/standalone';
import { CloudQuery, CloudObject, Pointer } from '../../lib/ncloud'; // 确保路径正确
import { CommonModule } from '@angular/common'; // 导入 CommonModule
import { FormsModule } from '@angular/forms'; // 导入 FormsModule
// 定义接口以确保类型安全
interface Questionnaire {
objectId: string;
createdAt: string;
QuestionnaireId: string;
title: string;
status: string;
questions: string[]; // 修改为字符串数组
}
interface Question {
objectId: string;
createdAt: string;
QuestionId: string;
questionnaireId: string; // 修改为字符串
questionText: string;
options: string[]; // 修改为字符串数组
}
interface Option {
objectId: string;
createdAt: string;
OptionId: string;
questionId: string; // 修改为字符串
optionText: string;
isSelected: boolean;
}
interface QuestionnaireResult {
objectId: string;
createdAt: string;
QuestionnaireResultId: string;
userId: Pointer;
questionnaireId: Pointer;
answers: Pointer[];
}
interface QuestionWithOptions extends Question {
optionsData: Option[];
}
@Component({
selector: 'app-interest-search',
templateUrl: './interest-search.component.html',
styleUrls: ['./interest-search.component.scss'],
standalone: true,
imports: [
IonTextarea,
IonCheckbox,
IonList,
IonButton,
IonContent,
IonHeader,
IonInput,
IonTitle,
IonToolbar,
IonItem,
IonLabel,
IonRadioGroup,
IonRadio,
IonDatetimeButton,
IonDatetime,
IonModal,
CommonModule,
FormsModule
]
})
export class InterestSearchComponent implements OnInit {
// 固定字段
name: string = '';
birthday: string = '';
// 动态问卷数据
questionnaire: Questionnaire | null = null;
questionsWithOptions: QuestionWithOptions[] = [];
answers: { [questionId: string]: string } = {}; // 存储用户答案
constructor() { }
ngOnInit() {
this.loadQuestionnaireData('test_q1'); // 使用 QuestionnaireId 'test_q1'
}
async loadQuestionnaireData(questionnaireId: string) {
try {
const questionnaireQuery = new CloudQuery("Questionnaire");
questionnaireQuery.equalTo("QuestionnaireId", questionnaireId);
const questionnaireObj = await questionnaireQuery.first();
if (questionnaireObj) {
const questionnaireData = questionnaireObj.data as Questionnaire;
// 确保 objectId 存在且为字符串
this.questionnaire = {
...questionnaireData,
objectId: String(questionnaireObj.id)
};
console.log("加载到的问卷数据:", this.questionnaire);
// 确保 questions 被正确传入
if (this.questionnaire.questions) {
await this.loadQuestions(this.questionnaire.questions);
}
} else {
console.error(`未找到 QuestionnaireId 为 ${questionnaireId} 的问卷。`);
}
} catch (error) {
console.error("加载问卷数据时出错:", error);
}
}
async loadQuestions(questionIds: string[]) {
this.questionsWithOptions = []; // 初始化问题列表
for (const questionId of questionIds) {
try {
const questionQuery = new CloudQuery("Question");
questionQuery.equalTo("QuestionId", questionId);
const questionObj = await questionQuery.first();
if (questionObj) {
const question = questionObj.data as Question;
// 异步加载选项并立即显示问题
this.questionsWithOptions.push({ ...question, optionsData: [] });
this.loadOptions(question.options).then((options) => {
const index = this.questionsWithOptions.findIndex(
(q) => q.QuestionId === question.QuestionId
);
if (index !== -1) {
this.questionsWithOptions[index].optionsData = options;
}
});
// 可选:每加载一个问题,立即触发渲染
console.log("已加载问题:", question);
}
} catch (error) {
console.error(`加载问题 ID ${questionId} 时出错:`, error);
}
}
}
async loadOptions(optionIds: string[]): Promise