Почему этот v-bind: value работает?

Я делаю систему корзины, используя 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, потому что, насколько я вижу, идентификатор не привязан к экземпляру 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-model и v-bind (я знаю, что вы не должны использовать оба на одном входе - это только последняя в длинной череде попыток), о которых я могу думать, но ничего не работает. Помощь!

У вас есть addToBasket(material), но вы не видите аргумент в определении функции.

Bhojendra Rauniyar 19.03.2018 12:39

@BhojendraNepal, спасибо - я исправил эту функцию. Однако это все еще не решает проблему несвязанности значения ...

user4676723 19.03.2018 12:53
v-model переопределит атрибут value. Вам нужно будет установить id в data.
Bert 19.03.2018 13:55

@Bert, как мне передать идентификатор в данные, если не путем захвата его в поле формы?

user4676723 19.03.2018 14:18

Я не любитель laravel, но вы рендерите сценарий, поэтому я ожидаю, что это будет что-то вроде data: { material: {id: {{ $material->id }}, ...}}.

Bert 19.03.2018 14:20

@Bert К сожалению, нет, Javascript просто сбивает с толку из-за неожиданного {.

user4676723 19.03.2018 14:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
181
1

Ответы 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.info(error))
        }
    }
}

Как я могу сделать это без использования элемента формы?

user4676723 19.03.2018 14:39

Только что отредактировал свой пост. Я не уверен насчет цели, которую вы пытаетесь достичь, так что это может быть не то, что вы хотели: /

Ekushisu 19.03.2018 15:01

Спасибо за ваши усилия - всего по одному материалу на странице. Пользователь щелкает материал, Laravel берет его из базы данных и отображает страницу, а должен вводит идентификатор этого материала в форму, чтобы Vue мог добавить его в корзину. Это то, чего не происходит.

user4676723 19.03.2018 15:17

Я не привык к рендерингу на стороне сервера vueJS laravel. Загружается ли приложение VueJS полностью, когда вы выбираете материал в списке? Или вы выполняете асинхронный вызов laravel для получения данных о выбранных материалах? В любом случае, это в основном то же самое. Вам нужно заполнить свой объект в функции данных vuejs. data() { return { material: { id : {{$material->id}}, quantity : 1}} Затем в вашем методе addToBasket просто отправьте this.material в параметрах вашему вызову API.

Ekushisu 19.03.2018 15:25

Другие вопросы по теме