在回调中设置控制器属性

时间:2013-03-14 20:22:39

标签: ember.js

我有以下控制器使用ember.jsember-auth gem。此控制器有效,但每次登录时都会设置loginError属性。

BaseApp.SignInController = Auth.SignInController.extend({
  email: null,
  password: null,
  loginError: false,
  signIn: function() {
    this.registerRedirect();
    Auth.signIn({
      email: this.get('email'),
      password: this.get('password')
    });
    this.set('loginError', true); // Sets correctly but each time
    Auth.on('signInError', function() {
      console.log("This is a signin error");
    });
  }
});

显然我想做的是在loginError调用的函数中将true设置为Auth.on,如下所示:

BaseApp.SignInController = Auth.SignInController.extend({
  email: null,
  password: null,
  loginError: false,
  signIn: function() {
    this.registerRedirect();
    Auth.signIn({
      email: this.get('email'),
      password: this.get('password')
    });
    Auth.on('signInError', function() {
      this.set('loginError', true); // Doesn't set the controller's property
      console.log("This is a signin error");
    });
  }
});

但这显然不起作用,因为回调内的范围是不同的。也许我错过了一些非常基本的东西。我怎样才能使它发挥作用?

1 个答案:

答案 0 :(得分:3)

上下文(即this)在您传递给on方法的匿名函数中与在控制器中不同。你可以通过将上下文保存到闭包中的另一个变量来解决这个问题。

var self = this;
Auth.on('signInError', function() {
  self.set('loginError', true); // Should now set the controller's property
  console.log("This is a signin error");
});