【问题标题】:VueJS bind select to object but still POST stringVueJS 将选择绑定到对象但仍然是 POST 字符串
【发布时间】:2017-05-09 07:42:52
【问题描述】:

将选择元素绑定到对象(而不是字符串值)但仍然让 HTML 元素提交字符串值的正确方法是什么?

我已经设法让它工作了,但似乎我正在利用一个错误:

<select v-model="selected" v-on:change="price=selected.price">
    <option v-for="item in items" v-bind:value="item" value="{{ item.id }}">{{ item.name }}</option>
</select>

这按预期工作:“selected”属性附加到“item”对象,但表单仅发布项目的 ID。但是,如果我颠倒 HTML 属性的顺序,使 value={{ item.id }} 出现在 v-bind:value="item" 之前,那么表单会发布“[Object]”,而不是例如“ 3"。

它如此脆弱的事实让我觉得我做错了什么。

那么处理这个问题的正确方法是什么?

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    我有过类似的情况,我构建了几个 vue 组件,它们既可以在 vue 组件中使用,也可以在标准表单中使用。

    <select v-model="selected" v-on:change="price=selected.price">
        <option v-for="item in items" :value="JSON.stringify(item)">{{ item.name }}</option>
    </select>
    

    看起来就是你所追求的。我也成功使用了计算属性或过滤器,但我认为 stringify 是最易读的。

    【讨论】:

      【解决方案2】:

      我使用这种方法修复了它:

      <select v-model="product">
        <option v-for="obj in choices" :value="obj">{{ obj.name }}</option>
      </select>
      <input type="hidden" name="product" :value="choice.id">
      

      总而言之:不要给您的 select 命名,而是将该名称提供给您的 hidden 输入,并提供 ID 作为该元素的值。

      【讨论】:

      • 出于某种原因,我忽略了这条评论并最终做了这件事。这也有效!
      【解决方案3】:

      我在这两种情况下都看到,HTML 呈现如下:

      <select>
        <option value="[object Object]">name1</option>
        <option value="[object Object]">name2</option>
        <option value="[object Object]">name3</option>
        <option value="[object Object]">name4</option>
      </select>
      

      案例一:v-bind:value="item" value="{{ item.id }}"fiddle

      案例2:value="{{ item.id }}" v-bind:value="item"fiddle

      因此,就呈现 HTML 而言,这两种情况是等价的。没有混淆的理想方法就是使用v-bind:value="item",如下所示:

      <select v-model="selected" v-on:change="price=selected.price">
          <option v-for="item in items" v-bind:value="item">{{ item.name }}</option>
      </select>
      

      您应该将v-bind 转换为itemitem.id,具体取决于您要分配给selected 变量的内容。

      【讨论】:

      • 谢谢,但这些都不起作用。如果我v-binditem 那么表单提交的值就是字符串“[object Object]”。如果我 v-binditem.id,那么这个问题就解决了,但 selected 模型只是 id,而不是整个项目,我需要它。
      • 为什么要让selected 成为完整模型:selected 将是您在&lt;option&gt; 中使用v-bind 的任何内容。我在http://jsfiddle.net/sh9kd1gg/2/ 中将selected 视为整个项目。
      • 我需要选择作为整个模型,因为我需要引用模型的“价格”属性(item.price)。在您发布的小提琴中,它(或多或少)有效,但我们又回到了原来的问题。发布该表单时,该选择字段的值将是“[object Object]”。我需要它是 item.id。
      • @adamthehutt 检查这个小提琴:jsfiddle.net/sh9kd1gg/3,如果这不起作用,你能用你的问题更新这个小提琴吗?
      • 是的,这行得通,但它要求您在 javascript 中拦截表单提交(以捕获 selected.id 并覆盖该表单字段的值)。我希望能够进行正常的 HTML 表单提交。但我想这是不可能的。无论如何感谢您的帮助。
      猜你喜欢
      • 2017-08-30
      • 2020-04-26
      • 2018-03-02
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      相关资源
      最近更新 更多