【问题标题】:Why is this v-bind:value working?为什么这个 v-bind:value 有效?
【发布时间】:2018-03-19 11:34:54
【问题描述】:

我正在使用 Laravel 和 Vue 制作一个篮子系统。我的 Vue 文件 cart.js 中有一个数据对象:

data: {
  material: {
    id: '',
    qty: '1',
  },
}

当点击产品页面上的“添加到购物车”按钮时,会调用以下函数:

addToBasket: function(){
  var that = this;
  var item = this.material;
  this.$http.post('/api/buy/addToBasket', item).then(response => {
    this.basketAddSuccess = true;
  }, response => {
      //error
  });
}

但是,这会失败并出现 500 错误,因为据我所知,id 没有绑定到 Vue 实例。这是查看代码:

<form v-on:submit.prevent="addToBasket(material)">
  <input type="hidden" v-model="material.id" v-bind:value="{{ $material->id }}">
  <div class="form-group">
        <label for="qty">Quantity</label>
        <input class="form-control" name="qty" type="number" v-model="material.qty" v-bind:value="1">
  </div>
  <button class="btn btn-block btn-primary">@{{ buttonText }}</button>
</form>

Laravel 正在根据呈现的代码正确地注入值:

<input type="hidden" v-model="material.id" value="1">

但这并没有绑定到 Vue。我已经尝试了v-modelv-bind 的所有排列(我知道你不应该在同一个输入上同时使用这两个 - 这只是一长串尝试中的最后一个),但似乎没有任何效果.救命!

【问题讨论】:

  • 你有 addToBasket(material) 但在你的函数定义中看不到参数。
  • @BhojendraNepal 谢谢 - 我已经修复了这个功能。但是还是没有解决值不绑定的问题……
  • v-model 将覆盖 value 属性。您需要在数据中设置id
  • @Bert 如果不是通过在表单字段中捕获它,我应该如何将 id 传递给数据?
  • 我不是 laravel 人,但你正在渲染脚本,所以我希望它会类似于 data: { material: {id: {{ $material-&gt;id }}, ...}}

标签: javascript laravel vue.js


【解决方案1】:

您需要在数据对象上设置值,而不是在模板上,因为您使用的是 v-model 指令。你应该看看这个,它很好地解释了 v-model 模型指令如何在后台工作:https://alligator.io/vuejs/add-v-model-support/

编辑 1:我刚刚写了一个包含多种材料的示例。无论如何,我不确定它是否会帮助你:

模板

<template>
    <div class="materials">
        <form 
            class="material"
            v-for="material in materials"
            :key="material.id"   
            @submit.prevent="addToBasket(material)"
        >
            <div class="form-group">
                <label for="quantity">Quantity</label>
                <input type="number" name="quantity" :value="material.qty">
            </div>
            <button class="btn btn-block btn-primary">@{{ buttonText }}</button>
        </form>
    </div>
</template>

Javascript,$materials 是一个 Laravel PHP 对象数组,包含 id 键和数量键

export default {
    data() {
        return {
            basketAddSuccess : false,
            materials : {!! json_encode($materials) !!}
        };
    },
    methods : {
        addToBasket(material) {
            this.$http.post('/api/buy/addToBasket', material).then(response => this.basketAddSuccess = true).catch(error => console.log(error))
        }
    }
}

【讨论】:

  • 如何在不使用表单元素的情况下做到这一点?
  • 刚刚编辑了我的帖子。我不确定您要达到的目标,因此可能不是您想要的:/
  • 感谢您的努力 - 每页只有一个材料。用户点击一个材质,Laravel 从数据库中抓取它并显示页面,然后应该将该材质的 id 注入到表单中,以便 Vue 可以将它添加到购物篮中。就是那部分不会发生。
  • 我不习惯 vueJS laravel 服务端渲染。当您在列表中选择材料时,VueJS 应用程序是否完全重新加载?或者您是否对 laravel 进行异步调用以获取选定的材料数据?无论如何,它基本上是一样的。您需要在 vuejs 数据函数中填充您的对象。 data() { return { material: { id : {{$material-&gt;id}}, quantity : 1}} 然后在您的 addToBasket 方法中,只需将 this.material 中的参数发送到您的 API 调用即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2018-06-27
  • 2021-07-24
  • 2023-03-07
  • 2018-01-17
相关资源
最近更新 更多