我对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
答案 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中,因为它位于函数内部。之一:
function (data)
来电替换为data =>
。或_self = this;
位于顶部,参考_self
代替。这至少应该让你开始。