在同一控制器中访问Ember控制器属性

时间:2015-09-04 19:06:08

标签: ember.js ember-cli

我对EmberJS 2.0很新,并试图通过构建我自己的网站来慢慢理解它。无论如何,我已经设法将Firebase与Ember集成,我的控制器能够正确验证。但是,我想了解执行时的原因:

this.send('toggleModal');

在authenticate动作属性函数(.then())中它不起作用,但如果我在外面执行它,那么一切正常。

1)'this'关键字是否与Ember控制器以外的其他东西混淆了?

以下是样本:

// /app/controllers/application.js
import Ember from 'ember';

export default Ember.Controller.extend({
  isShowingModal: false,
  actions: {
    toggleModal: function() {
      this.toggleProperty('isShowingModal');
    },
    authenticate: function(username, pass) {
      this.get('session').open('firebase', {
        provider: "password",
        email: username,
        password: pass
      }).then(function (data) {
        console.log(data.currentUser);
        console.log(session.isAuthenticated); //Why is 'session' not defined?
        this.send('toggleModal'); //This doesn't work. Throws an error.
      });

      this.send('toggleModal'); //This works.
    },
    logOut: function() {
      this.get('session').close();
    }
  }
});

2)另外,我注意到在使用Emberfire时我可以在模板application.hbs中使用属性'session.isAuthenticated'但是,'session'不应该是一个注入所有人的对象使用Torii的路线和控制器?为什么application.js控制器中的属性不可访问/未定义?我使用https://www.firebase.com/docs/web/libraries/ember/guide.html#section-authentication作为参考。

3)在上面的指南中,认证操作被放在路由中。但是,根据这个quora帖子,路由应该只处理模板渲染和模型接口。这篇文章不正确吗?验证逻辑应该驻留在application.js控制器中吗? https://www.quora.com/What-is-the-best-way-to-learn-Ember-js

2 个答案:

答案 0 :(得分:2)

  

1)这是'这个'关键词与Ember控制器以外的东西混淆了吗?

是。这是Javascript最常见的关键点之一。那里有很多关于它的文章,但是this one看起来很不错。要解决此问题,您需要使用箭头函数,将函数绑定到当前上下文,或将上下文保存在局部变量中。 (尽管首先阅读那篇文章。)

  

2)另外,我注意到在使用Emberfire时,我可以使用该属性' session.isAuthenticated'然而,在模板application.hbs中,不应该会话#t;是一个使用Torii注入所有路由和控制器的对象?为什么application.js控制器中的属性不可访问/未定义? ...

那是因为模板从当前上下文(您的控制器)中提取属性。在控制器内部,您必须使用this.get('session')。 (在你解决了我上面提到的问题之后。)

  

3)...这篇文章不正确吗? ...

我不会说不正确,只是有点过于简单。我会遵循图书馆使用的任何惯例,因为根据图书馆的要求,这可能是最好的方式。

答案 1 :(得分:0)

你对this部分正确,尽管它并不是真的很困惑。 this(你的模态调用不起作用)不再限制在Controller中,因为它位于函数内部。之一:

    如果您正在使用ember cli,则
  1. function (data)来电替换为data =>。或
  2. var _self = this;位于顶部,参考_self代替。
  3. 这至少应该让你开始。