【问题标题】:Is there a way to add properties or component data to looped objects with Alpine.js?有没有办法使用 Alpine.js 向循环对象添加属性或组件数据?
【发布时间】:2020-10-16 18:06:45
【问题描述】:

基本上我正在从服务器接收 JSON,并希望将属性添加到我正在循环的对象或组件的 x-data,这可以通过 alpine.js 实现吗?

数据是按时间间隔请求的数据,类似于:

let teams = [
    { id: 1, name: 'Person 1'},
    { id: 2, name: 'Person 2'},
    ...
];

我想做的是向循环的team 对象添加一个新属性favourite,默认设置为false,或者将其添加为组件数据。我计划稍后使用此属性过滤列表。目前我有:

<template x-for="team in teams" :key="team.id">
    <tr>
        <td x-text="team.name"></td>
        <td>
            <input type="checkbox" x-model="favourite">
        </td>
    </tr>
</template>

我已经尝试了一些方法来使其正常工作,例如使用:

x-data="{ team: team, favourite: false }"

trtemplate 标记上以及不将team 对象传递给x-data 指令。 x-forx-data 指令之间似乎存在冲突,因为这会引发错误:Uncaught ReferenceError: team is not defined

我也尝试在x-data 指令旁边使用x-init,但无济于事。

在这个阶段,我想知道是否必须切换到另一个 JS 库才能使其正常工作(如有必要,欢迎提出建议),或者我的方法是否根本错误。

任何帮助/指针将不胜感激。

【问题讨论】:

    标签: javascript arrays object alpine.js


    【解决方案1】:

    原则上,您应该做的是在“最喜欢”字段到达x-for 之前添加它。

    例如,如果您使用 fetch 加载 teams,您可以这样做:

    <div
      x-data="{ teams: [] }"
      x-init="setInterval(() => {
        fetch('/teams-url').then(res => res.json()).then(teamsData => {
          teams = teamsData.map(team => ({ favourite: false, ...team }));
        });
      }, 1000);"
    >
    

    我还注意到您的示例使用了v-modelv-text,它们应该分别是x-modelx-text

    【讨论】:

    • 我原以为可能是这种情况,问题是最喜欢的是用户特定的数据,我将使用本地存储进行跟踪,所以当我拉动时我不想重置再次在数据中。没错,在示例中应该是 x- 而不是 v-,这是深夜编程的缺点
    • 通过该示例,您可以从本地存储中加载收藏夹并进行水合(而不是将收藏夹设置为 false,您可以根据本地存储中的内容来决定)
    猜你喜欢
    • 2019-06-21
    • 2021-09-05
    • 2017-06-11
    • 2014-06-15
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多