5

I've got a component and I would like to set a data item outside the component.

How would I do this with a directive?

I was thinking about something like this:

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

But it's not working:

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

Vue.component('test', {
	template: '<p>{{date}}</p>',
  data() {
  	return {
    		date: ""
    }
  }
});

new Vue({
  el: '#app'
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.1/vue.js"></script>


<div id="app">
  <test v-init:date="'2017-07-20 09:11:42'"></test>
</div>

Any Idea how I would get this to work?

--edit--

I don't want to use props for this! I've lots and lots of fields.

1
  • By inspecting vnode, it turns out it points to the root vue. That's why it didn't work for you. Check out my answer below for a solution. Commented Jul 20, 2017 at 13:14

3 Answers 3

3

This should work.

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

Vue.component('test', {
  template: '<p>{{date}}</p>',
  data() {
    return {
      date: ""
    }
  }
})

new Vue({
  el: '#app'
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.1/vue.js"></script>


<div id="app">
  <test v-init:date="'2017-07-20 09:11:42'"></test>
</div>

Sign up to request clarification or add additional context in comments.

Comments

2

You can refer to a component's data using $data.

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

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

new Vue({
  el: '#app',
  data: {
    ciudad: ''
  },
  components: {
    cityInput: {
      data() {
        return {
          ciudad: ''
        }
      }
    }
  }
})
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>
<div id="app">
  <input v-model="ciudad" v-init:ciudad="'Madrid'"> {{ciudad}}
  <city-input inline-template>
    <div>
      <input v-model="ciudad" v-init-data:ciudad="'Lisbon'"> {{ciudad}}
    </div>
  </city-input>
</div>

Comments

0

If I understood you correctly you should be using props for passing the data to your components. As a matter of fact you can use only one variable (either date or initDate), the usage is the same.

Vue.component('test', {
  template: '<p>{{date}}</p>',
  props:['initDate'],
  data() {
    return {
            date: ""
    }
  }
});

new Vue({
  el: '#app'
});

And then in html you use it like this:

<div id="app">
  <test :initDate="2017-07-20 09:11:42"></test>
</div>

5 Comments

You want to put this.initDate as the initial value for date, tho, right?
No, I don't want to use props for this. I have lots of textfields etc.... any Idea how I could fix this?
@Jenssen Is it always the same value or does it vary? You can set the default value of the property (i.e. you don't have to define anything).
@Agramer no it's not. I would like to use this with Laravel old('date');
This is working: jsfiddle.net/v5djagta but he's not working with components.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.