3

I have the following jsfiddle example (check the console) and all you will see is [object Object] instead of person data:

So, basically I have a vuejs instance and a div for v-for to iterate an object

<div id='app'>
  <p v-for="person in people[0]"> 
    <span> {{ person.name }}</span>
        <i class="fa fa-check" 
        v-bind:data-identity="person" 
        @click="addDetail($event)"></i>
  </p>
</div>

The problem is that if I echo {{ person }} I can see a JSON data on the page, but if I try to get it in the function addDetail() with e.target.dataset.identity then all I get is [object Object] and not the json data. I have tried JSON.parse and String methods, non of them work.

4
  • would @click="addDetail(person)" do the trick ? Commented Aug 30, 2017 at 8:06
  • does it show [object Object] when you try to log the object? Commented Aug 30, 2017 at 8:06
  • @Nemani yes, you can see the jsfiddle console I only get [object Object] Commented Aug 30, 2017 at 8:11
  • @hannesneukermans It does not matter how person is passed, I always get the [object Object] output Commented Aug 30, 2017 at 8:11

5 Answers 5

3

v-bind:data-identity="person" coverts person to string hence you can't attach an object to dataset as any object.toString() method returns [Object object] and you are getting the same

try to attach any string like person.name and see if it is reflected in your dataset

https://jsfiddle.net/qthg4Lwm/

hope this will help :)

EDIT: All data attributes are string read this article

from above article

Each property is a string and can be read and written. In the above case setting article.dataset.columns = 5 would change that attribute to "5".

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

4 Comments

I don't know why your jsfiddle isn't working. Did you forget to update it? Because I still don't understand
Thanks. But you are still passing person.name if I have to do it your way, I would need many data- attributes. I just want to pass the whole person object in one data attr
As mentioned in my Answer, you can't pass object to data attribute, data attribute converts any passed value to String
instead you can pass person object to addDetail function
2

You shouldn't try to access "person" through event and the DOM but give it as parameter to the function addDetail

Template

<div id='app'>
  <p v-for="person in people[0]"> 
    <span> {{ person.name }}</span>
        <i class="fa fa-check" 
        @click="addDetail(person)"></i>
  </p>
</div>

Script

...
methods: {
  addDetail: function(person){
    console.log(person)
  }
}
...

Comments

2

Just passing handler method @click is enough. See Vue reference for event handling

Template:

<i class="fa fa-check" @click="addDetail(person)"></i>

JS:

methods: {
  addDetail: function (person) {
    console.log(person);
  }
}

2 Comments

It's still the same, no difference from the output I was getting
I have edited my answer. By doing this you'll get the person object every time you click on i tag. Please check and let me know
1

For me using JSON.stringify() solved that problem:

v-bind:data-identity="person"

will give data-identity="[object object]"

Where as:

v-bind:data-identity="JSON.stringify(person)"

will convert your json/object to string, and it will work

data-identity="{"id":1,"name":"User 1"}"

Comments

0

in my case i have the same var name in html (inside v-for) & and in data function and everytime another var been used by browser...

Comments

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.