2016-12-07 3 views
0

Мне нужна помощь. Мой код находится в системе. Когда пользователь нажимает на login: Я поставил кнопку Отключить, чтобы избежать этого, пользователь может делать кнопку много раз, когда система работает, ждет ответаMeteor.setTimeout() внутри внутри Meteor.loginWithPassword()

Мой код работает отлично, но я ставлю класс загрузчика, когда пользователь нажмите кнопку входа в систему.

Когда пользователь вводит пароль и воспринимается, система отправляет нас к следующему виду. Это прекрасно работает, но ... Проблема заключается в следующем: Когда пользователь помещает неверный пароль this.loadingActive = true;, не меняйте его. Кнопка остается со спином, активным навсегда. Я имею в виду что-то случилось, что переменная loadingActive DonT изменения в true

мой 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> 

Это файл мой 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); 
     }) 
    ); 
} 

Почему, когда я поставить Meteor.setTimeout внутри Meteor.loginWithPassword случается так? любые идеи?

спасибо!

+0

Это не является хорошим образцом для скорости ограничивающем. Посмотрите на [DDPRateLimiter] (https://docs.meteor.com/api/methods.html#ddpratelimiter). Кроме того, я думаю, проблема заключается в том, что 'this' внутри' setTimeout' не является тем же самым "этим", что и во внешней области. –

ответ

0

Я вижу, что вы завершаете обратный вызов внутри this.$bindToContext. Не уверен, что он делает, но я предполагаю, что он меняет контекст() функцию обратного вызова, так что this.loadingActive = true не влияет.

Для решения этой проблемы можно использовать ссылочную переменную:

login() { 
    const self = this; 
    // ... 
    Meteor.loginWithPassword(
    self.credentials.email.toLowerCase(), 
    self.credentials.password, 
    self.$bindToContext((err) => { 
     Meteor.setTimeout(() => { 
     // ... 
     self.loadingActive = true; 
     }, 1000); 
    } 
)); 
} 
Смежные вопросы