2015-05-29 2 views
7

Sto imparando Vue.JS e ho riscontrato un piccolo problema. Desidero che l'utente sia in grado di fare clic su un tag <a href="#"></a>, e.preventDefault() e di prelevare anche l'oggetto associato al collegamento. Ecco il mio codice (nota che ho @ precedente la {{ perché sto usando Blade):VueJS - Preimpostazione predefinita sul clic del collegamento ma anche sull'oggetto di acquisizione

<a href="#" 
        class="list-group-item" 
        v-repeat="responder: responders" 
        v-on="click: showResponder(responder)"> 
        <div class="media"> 
         <div class="media-left"> 
          <img src="" v-attr="src: responder.avatar" alt="" class="media-object"/> 
         </div> 
         <div class="media-body"> 
          <h4 class="media-heading">@{{ responder.first_name }} @{{ responder.last_name }}</h4> 
          <p> 
           <strong><i class="fa fa-phone"></i> Phone:</strong> @{{ responder.phone }} 
          </p> 
         </div> 
        </div> 
        </a> 

E il Javascript:

var vm = new Vue({ 
      el: "#responderContainer", 
      data: { 
       activeResponder: null, 
       responders: [] 
      }, 
      methods: { 
       showResponder: function(responder) 
       { 
        // Here is where I wish to prevent the 
        // link from actually firing its default action 
        responder.preventDefault(); 
        this.activeResponder = responder; 
       } 
      } 
     }); 

Questo funziona per quanto afferrare l'oggetto responder ma spara la link - Devo essere in grado sia di e.preventDefault() che di ottenere l'oggetto.

Grazie!

risposta

20

Il documentation mostra è possibile passare $ manifestazione per ottenere l'oggetto evento

http://vuejs.org/guide/events.html

<button v-on="click: submit('hello!', $event)">Submit</button> 

/* ... */ 
{ 
    methods: { 
    submit: function (msg, e) { 
     e.stopPropagation() 
    } 
    } 
} 
/* ... */ 

Così si desidera che il v-on attributo da

v-on="click: showResponder(responder,$event)" 

e la definizione della funzione deve essere

showResponder: function(responder,e) 
+1

Grazie! In realtà sto seguendo il tutorial di laracasts su questo, o non siamo ancora arrivati ​​così lontano o l'ho perso;) Scaveremo tra i documenti ancora. Vue è fantastico! – NightMICU

11

In alternativa, in Vue 1.x, si potrebbe anche utilizzare il event modifier.prevent:

HTML:

<a v-on:click.prevent="showResponder(responder)">...</a> 

Si potrebbe fermare la propagazione così:

<a v-on:click.prevent.stop="showResponder(responder)">...</a> 

JS:

... 
      showResponder: function(responder) 
      { 
       // No need to prevent any more 
       this.activeResponder = responder; 
      } 
... 
+1

In realtà dovrebbe essere 'v-on: click.prevent' –

+1

Grazie, hai ragione, ovviamente :) – nils