2015-06-16 5 views
10

Ich erstelle ein Wizard-Login-Formular, in dem die Handynummer zuerst eingegeben wird und als nächstes Passwort eingegeben wird.vuejs: Ich versuche, die Eingabe mit der v-el-Direktive zu fokussieren

Hier bin versucht, das Passwort-Eingabe

this.$$.passwordInput.focus() 

jedoch mit zu konzentrieren, wenn ich immer die unten angegebenen Fehler

Uncaught TypeError: Cannot read property 'focus' of undefined 

Der vollständige Code ist unten

index.html

<div id="login"> 
    <div v-if="flow.mobile"> 
    <form v-on="submit: checkmobile"> 
     <p> 
      Mobile Number<br> 
      <input type="text" v-model="mobile_number" v-el="mobileNumber"> 
     </p> 
    </form> 
    </div> 
    <div v-if="flow.password"> 
    <form v-on="submit: checkpassword"> 
     <p> 
      Password<br> 
      <input type="password" v-model="password" v-el="passwordInput"> 
     </p> 
    </form> 
    </div> 

script.js

var demo = new Vue({ 
el: '#login', 
data: { 
    flow: { 
     mobile: true, 
     password: false 
    } 
}, 
methods: { 
    checkmobile: function(e) { 
     e.preventDefault(); 
     this.flow.mobile = false; 
     this.flow.password = true; 
     this.$$.passwordInput.focus(); 
    }, 
    checkpassword: function(e) { 
     e.preventDefault(); 
    } 
} 

});

Antwort

35

Ihr passwordInput befindet sich in einem v-if-Block, der nur gerendert wird, wenn Sie flow.password auf true setzen; Vue verwendet jedoch asynchrones Rendern, sodass der v-if-Block nicht sofort gerendert wird. Sie können Vue.nextTick verwenden, zu warten, bis es funktioniert:

this.flow.password = true; 
var self = this; 
Vue.nextTick(function() { 
    self.$$.passwordInput.focus(); 
}); 

Lesen Sie den Leitfaden über async, um weitere Informationen zu machen: http://vuejs.org/guide/best-practices.html#Understanding_Async_Updates

+0

Vielen Dank! Es hat funktioniert –

+0

Ich füge das nur hinzu, wenn du deine el diese innerhalb einer anderen Methode referenzierst, lebt der Vue.nextTick innerhalb dieser Methode. Das war nicht überdeutlich. – zmonteca

1

Glad dies für einige von euch gearbeitet. Ich habe keine Ahnung warum, aber nachdem ich jede erdenkliche Variation der akzeptierten Antwort versucht habe, konnte ich die Eigenschaft $$. Ref bei Verwendung von v-repeat nicht erhalten. Ich konnte nur Zugriff auf die neu geschaffenen dom Elemente wie so:

new Vue({ 
el: '#reporting_create', 
data: { 
    recipients: { 
     0: { 
      fname: null, 
      lname: null, 
      email: null, 
      registration: false, 
      report: false 
     } 
    }, 
    curRec:1 
}, 
methods: { 
    addRecipient: function(){ 
     event.preventDefault(); 
     this.recipients.$add(
      this.curRec, 
      { 
       fname: null, 
       lname: null, 
       email: null, 
       registration: false, 
       report: false 
      } 
     ); 
     var num = this.curRec; 
     this.$nextTick(function() { 
      console.log(this._children[num].$$.rowrec); 
      newSwitches.find('.switch').bootstrapSwitch(); 
     }) 

     this.curRec++; 
    } 
}}) 

html:

<template v-repeat="recipients"> 
     <div class="row" v-el="rowrec"> 
      <div>{{$key}}</div> 
     </div> 
</template> 

Die addRecipients Funktion außerhalb der v-repeat so auch die vorgeschlagene Antwort here konnte nicht helfen, habe gerufen wurde

Nicht sicher, ob es ein Problem gibt, es auf diese Weise zu tun, aber es funktioniert und ich bin müde.

1

Vue.js 1 funktioniert ein bisschen anders.

Beispiel:

<textarea v-el:model_message></textarea> 

JS:

this.$els.model_message.focus(); 
0

Wenn Sie mit Vue.js 2.0, sollten Sie Folgendes tun:

<input type="text" v-model="currentItem.name" ref="txtName"> 

So können Sie diese Eingabe zugreifen, indem sie die $ Refs mit Objekt:

this.$refs.txtName.focus(); 

Ich hoffe, es hilft .

4

In Vue.js 2.x können Sie Ihre eigene Richtlinie erstellen automatisch ein Feld zu konzentrieren:

<input v-focus> 

Arbeits:

Vue.directive('focus', { 
    inserted: function (el) { 
     el.focus(); 
    }, 
    update: function (el) { 
     Vue.nextTick(function() { 
       el.focus(); 
     }) 
    } 
}) 

Dazu v-focus Attribut auf Eingaben und andere Elemente verwenden können Beispiel: https://jsfiddle.net/LukaszWiktor/cap43pdn/

+0

Dies ist die einzige Lösung, die für meine Eingabefelder in einer v-for-Schleife funktioniert. – STWilson

+0

Ich musste diese Lösung ändern, um das Update zu entfernen: Teil. Ich hatte zwei Felder, Benutzername und Passwort und markierte den Benutzernamen mit v-Fokus. Bei der Eingabe des Passworts würde der Fokus mit jedem Zeichen auf den Benutzernamen zurückspringen. Ich kann mir vorstellen, dass ich vielleicht durch das Entfernen der Update-Funktion einige Ereignisse verpassen werde, die den Fokus auf den Benutzernamen auslösen sollten, aber bis jetzt noch nicht dazu gekommen sind. – William

Verwandte Themen