Edvard Åkerberg
Edvard Åkerberg

Reputation: 2191

Validation error Form Request v-model Laravel vue.js

I have a problem.

I'm using a Form Request but also Vue on my form. My problem is that old('') variables does not work together with Vue v-model.

Here is an example of the input field.

<div class="form-group">
    <label for="name">{{ trans('messages.name') }}</label>
    <input type="text" name="name" v-model="name" id="name" value="{{ old('name') }}" class="form-control">
    @if($errors->has('name'))
      <span class="help">
        {{trans('Validations.name')}}
      </span>
    @endif
</div>

If I remove the v-model="name" the {{ old('name') }} variable works.

This is the error i get from Vue in the browser.

<input v-model="name" value="asdasdasd">:

inline value attributes will be ignored when using v-model. Declare initial values in the component's data option instead.

vue file

<script>
  import RangeSlider from './RangeSlider.vue';

  export default {
    components: {
      RangeSlider,
    },

    props: ['fields'],

    data() {
      return {
        name: '',
        email: '',
        phone: '',
        loading: false,
        errors: {},
      };
    },

    methods: {
      onSubmit() {
        this.loading = true;
      }
    }
  };
</script>

Upvotes: 1

Views: 2203

Answers (2)

Saurabh
Saurabh

Reputation: 73589

You should try this with the help of v-bind, which dynamically bind one or more attributes.

<input type="text" name="name" v-model="name" id="name" v-bind:value="old('name')" class="form-control">

However if you want to set an initial value to the input field, you can just set the data variable name as the value (old('name')) you want to set.

HTML

<input type="text" name="name" v-model="name" id="name" class="form-control">

JS

data() {
  return {
    name: 'oldValue',
    email: '',
    phone: '',
    loading: false,
    errors: {},
  };
},

Upvotes: 0

craig_h
craig_h

Reputation: 32694

Vue does not allow you to initialise model data from the HTML, because Vue expects you to retrieve data from an API and set it from the Vue instance, which can be a pain when using it in conjunction with blade. The simplest way around this is to create a directive to make the init yourself:

Vue.directive('init', {
  bind: function(el, binding, vnode) {
    vnode.context[binding.arg] = binding.value;
  }
})

Then use as:

<input type="text" name="name" v-model="name" id="name" v-init:name="'{{old('name')}}'" class="form-control">

Here's the JSFiddle: https://jsfiddle.net/0uvqmodc/

Upvotes: 2

Related Questions