You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte开发Amazon Turk任务:任务切换失效,多任务同页显示问题

问题:所有Task组件同时显示,无法逐个切换

问题根源

你用Array(numberOfTasks).fill({show: false})创建tasks数组时,fill方法会把同一个对象引用填充到数组的每个位置。这意味着数组里的所有task其实都是同一个对象——初始设置tasks[0].show = true时,所有task的show属性都会同步变成true,导致所有Task组件同时显示在页面上。

解决方案

1. 修正tasks数组的初始化方式

把数组初始化代码改成以下任意一种,确保每个数组元素都是独立的对象:

方式一(推荐):用Array.from创建独立对象

let tasks = Array.from({length: numberOfTasks}, () => ({show: false}));

方式二:用循环逐个创建对象

let tasks = [];
for (let i = 0; i < numberOfTasks; i++) {
    tasks.push({show: false});
}

2. 验证逻辑(无需修改原函数)

你的nextTask函数逻辑本身是正确的,修正数组初始化后,修改单个task.show属性只会影响对应的组件:

function nextTask(currentIndex: number){
    tasks[currentIndex].show = false;
    if (currentIndex < numberOfTasks - 1){
        tasks[currentIndex+1].show = true;
    }
}

修改后的完整App.svelte脚本部分

<script lang="ts">
    import Captcha from "./components/Captcha.svelte";
    import ExampleGuidelines from "./components/ExampleGuidelines.svelte"
    import TrainingGuidelines from "./components/TrainingGuidelines.svelte"
    import TaskGuidelines from "./components/TaskGuidelines.svelte"
    import Consent from "./components/Consent.svelte";
    import Example from "./components/Example.svelte";
    import Training from "./components/Training.svelte";
    import Task from "./components/Task.svelte";

    let notRobot = false;
    let consentChecked = false;
    let showExample = true;
    let showTraining = true;
    let showTasks = false;
    const numberOfTasks = 10;
    let showNextTask = true;
    const imageDir = `https://raw.githubusercontent.com/lieldvd/mturk/main/15545`;
    // 修正:每个元素都是独立对象
    let tasks = Array.from({length: numberOfTasks}, () => ({show: false}));
    tasks[0].show = true; 

    function nextTask(currentIndex: number){
        tasks[currentIndex].show = false;
        if (currentIndex < numberOfTasks - 1){
            tasks[currentIndex+1].show = true;
        }
    }
    function startTraining(){
        showTraining = true
        showExample = false
    }
    function startTasks(){
        showTasks = true;
        showTraining = false;
    }
</script>

完成上述修改后,点击Task组件的"Next"按钮,就会隐藏当前任务并显示下一个,实现逐个切换的预期效果。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:48:11