Vue-Multiselect 和 Laravel 5.3 选项显示为 JSON 元素

Vue-Multiselect and Laravel 5.3 options show up as JSON element

我有一个 Laravel 5.3 应用程序并使用 vue-multiselect(版本 2.0.0-beta13)显示 multiple selects。 select 的选项是通过对给定路由的 AJAX GET 调用获取的(为了便于阅读而缩短)。

[
    {
        "address1": "-",
        "address2": "-",
        "city": "-",
        "company": "-",
        "id": 0
    },
    {
        "address1": "Adresse 1 und so",
        "address2": "",
        "city": "Wien",
        "company": "Abernathy company",   
        "id": 27
    }
]

这似乎是有效的 json,当使用 Chrome 的网络选项卡进行检查时,一切似乎都很好。

我的 Vue 组件中有这段代码:

<multiselect
    v-model="companyIDs"
    :allow-empty="true" 
    :value="selected"
    :multiple="true"
    :close-on-select="false"
    :label="company"
    :track-by="id"
    :options="companies"
>
</multiselect>

这是选项 (companies) 如何在 select 中显示的屏幕截图:

这是怎么回事?

我假设 options 是作为 API 响应接收到的整个对象数组。如果只想显示公司名称,则必须在将它们用作值之前将其挑出。但这很麻烦,而且可能感觉像是 hack,幸运的是,Vue-Multiselect 作者已经想到了这一点,因此他们添加了使用对象数组的功能 (documentation)。这两个选项是 labeltrack-by。你所做的是使用 :track-by:label,这不是一回事,因此图书馆无法识别。

同样,因为您没有解释您到底想显示什么,我假设您只想显示列表中每个对象的 object[i].company。在这种情况下,您可以将 label="company"track-by="id" 添加到组件标记中。

如果您对要显示为 UI 选项的内容有更复杂的逻辑,则必须将作为 API 响应接收到的对象数组映射到一个字符串数组中想展示给用户。

您只需从您的代码中删除两个 :,以下应该有效:

<multiselect
    v-model="companyIDs"
    :allow-empty="true" 
    :value="selected"
    :multiple="true"
    :close-on-select="false"
    label="company"
    track-by="id"
    :options="companies"
>

当您在属性前添加 : 时:即 shortcut for v-bind and vue starts to expect that as vue data 变量而不是简单的字符串。看起来你希望它是纯字符串而不是 vue 变量。这就是错误的根本原因。