2016-12-07 5 views
0

Ich brauche Hilfe. Mein Code ist in einem Login. Wenn der Klick Benutzer in login: Ich habe eine Schaltfläche deaktivieren setzen zu vermeiden, dass der Benutzer oft tun klicken, wenn das System arbeitet, ist für eine Antwort zu wartenMeteor.setTimeout() innerhalb von Meteor.loginWithPassword()

Mein Code funktioniert gut, aber ich habe der Benutzer eine Loader-Klasse, wenn Klicken Sie auf den Button Login.

Wenn der Benutzer das Passwort eingibt und akzeptiert wird, sendet das System uns zur nächsten Ansicht. Das funktioniert gut, aber ... Das Problem ist: Wenn der Benutzer ein ungültiges Passwort eingeben this.loadingActive = true; nicht ändern .. die Schaltfläche bleiben mit dem Spin für immer aktiv. Ich meine etwas passiert ist, dass die Variable loadingActive Änderung nicht zu true

mein html

<button class="btn btn-default btn-lg btn-block" 
     ng-class="{'disabled': login.loadingActive === false}" 
     ng-disabled="loginForm.$invalid || login.loadingActive === false" 
     ng-click="login.login()"> 
    <span ng-hide="login.loadingActive" class="fa fa-refresh animacion-cargando"></span> 
    <span ng-hide="login.loadingActive">loading...</span> 
    <span ng-show="login.loadingActive">Login</span> 
</button> 

Das ist mein js

login() { 
    this.loadingActive = false; 
    this.error = ''; 
    Meteor.loginWithPassword(this.credentials.email.toLowerCase(), this.credentials.password, 
     this.$bindToContext((err) => { 
      Meteor.setTimeout(() => { 
       if (err) { 
        this.loadingActive = true; 
        this.error = err; 
       } else { 
        this.loadingActive = true; 
        this.$state.go('app.pageOne'); 
       } 
      }, 1000); 
     }) 
    ); 
} 

Datei Warum, wenn ich in einen Meteor.setTimeout setzen ein Meteor.loginWithPassword passiert das? irgendwelche Ideen?

danke!

+0

Dies ist kein gutes Muster für geschwindigkeitsbestimmend. Sehen Sie sich [DDPRateLimiter] an (https://docs.meteor.com/api/methods.html#ddpratelimiter). Außerdem denke ich, dass das Problem darin besteht, dass "dies" innerhalb des 'setTimeout' nicht dasselbe ist wie im äußeren Bereich. –

Antwort

0

Ich sehe Sie wickeln Sie den Rückruf innerhalb einer this.$bindToContext. Nicht sicher, was es tut, aber meine Vermutung ist, dass es den Kontext (this) die Callback-Funktion ändert, so dass this.loadingActive = true keinen Effekt hat.

dies zu beheben Sie eine Referenzvariable verwenden:

login() { 
    const self = this; 
    // ... 
    Meteor.loginWithPassword(
    self.credentials.email.toLowerCase(), 
    self.credentials.password, 
    self.$bindToContext((err) => { 
     Meteor.setTimeout(() => { 
     // ... 
     self.loadingActive = true; 
     }, 1000); 
    } 
)); 
} 
Verwandte Themen