在ember js中实现查找的最佳方法,而不是失去当前的控制器范围

时间:2013-04-24 13:24:00

标签: ember.js

我想基于id做一个ember js find。

如果存在具有该id的对象,我想对该对象执行一些逻辑。

所以,我基于以下代码这样做:

Cluey.UsersController = Ember.ArrayController.extend({
  keypadNum: "",
  loginWithPin: function() {
    var res;
    console.log("Login with pin: " + this.get('loginPin'));
    res = Cluey.User.find({
      pin: this.get('loginPin')
    });
    return res.on('didLoad', function() {
      var user;
      if (res.get('firstObject') != null) {
        user = res.objectAt(0);
        return this.doLogin(user);
      } else {
        return alert("User not found with pin " + this.get('loginPin'));
      }
    });
  },
  doLogin: function(user) {
    //some code
  }
});

问题是,一旦我进入res.on('didLoad')回调,我就失去了控制器的范围,因此当我尝试访问this.get(“loginPin”)时,它返回为未定义。

有谁知道如何解决这个问题。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您将对象作为on事件中的第二个参数传递,它将成为回调中的上下文。

您可以将this作为didLoad事件的第二个参数传递:

res.on('didLoad', this, function() {
  var user;
  if (res.get('firstObject') != null) {
    user = res.objectAt(0);
    return this.doLogin(user);
  } else {
    return alert("User not found with pin " + this.get('loginPin'));
  }
});

答案 1 :(得分:0)

您可以创建一个名为self的var并为其指定this

Cluey.UsersController = Ember.ArrayController.extend({
  keypadNum: "",
  var self = this;
  loginWithPin: function() {
    var res;
    console.log("Login with pin: " + this.get('loginPin'));
    res = Cluey.User.find({
      pin: self.get('loginPin')
    });
    return res.on('didLoad', function() {
      var user;
      if (res.get('firstObject') != null) {
        user = res.objectAt(0);
        return this.doLogin(user);
      } else {
        return alert("User not found with pin " + this.get('loginPin'));
      }
    });
  },
  doLogin: function(user) {
    //some code
  }
});