2015-09-04 190 views
1

我對EmberJS 2.0非常新,並試圖通過構建自己的網站來慢慢理解它。無論如何,我已經設法將Firebase與Ember集成,並且我的控制器能夠正確進行身份驗證。不過,我想知道爲什麼當我執行:訪問Ember控制器屬性在同一個控制器內

this.send('toggleModal'); 

的身份驗證action屬性函數內(。那麼()),這是行不通的,但如果我之外執行它,然後一切工作正常。

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)另外,我注意到,使用餘燼當我能夠使用屬性「session.isAuthenticated」但是內模板application.hbs,不該't'session'是一個注入所有使用Torii的路由和控制器的對象?爲什麼該屬性在application.js控制器中不可訪問/未定義?我使用https://www.firebase.com/docs/web/libraries/ember/guide.html#section-authentication作爲參考。

3)在上面的指南中,認證動作放在路由中。但是,根據這個quora post,路由只能處理模板渲染和模型接口。這篇文章不正確嗎?身份驗證邏輯應該駐留在application.js控制器中是否正確? https://www.quora.com/What-is-the-best-way-to-learn-Ember-js

回答

2

1)'this'關鍵字與Ember控制器以外的東西混淆了嗎?

是的。這是Javascript最常見的問題之一。有很多關於它的文章,但this one看起來不錯。要解決它,您需要使用箭頭函數,將函數綁定到當前上下文,或將上下文保存在局部變量中。 (請閱讀文章首先雖然)。

2)另外,我注意到,使用餘燼當我能夠使用屬性「session.isAuthenticated」但是內模板application.hbs,不應該'會話'是一個注入所有路由和控制器使用Torii的對象?爲什麼該屬性在application.js控制器中不可訪問/未定義? ...

這是因爲模板從當前上下文(您的控制器)中提取屬性。在控制器內部,您必須改用this.get('session')。 (解決了上面提到的問題後)

3)...此帖是否有誤? ...

我不會說錯,只是有點過於簡單。我會遵循圖書館使用的任何約定,因爲這可能是圖書館要求的最佳方式。

0

對於this,你有一部分是正確的,但它並沒有真正混淆。 this(你的模態調用不起作用)不再限制在Controller中,因爲它在一個函數內部。或者:

  1. 如果你使用燼CLI與data =>更換function (data)電話。或者
  2. var _self = this; up top和參考_self

這應該至少讓你開始。

+0

此外,你應該讓'session'this.get('session');'在頂部並在稍後引用'session',這將解決你的'undefined'(因爲你從來沒有定義過它)。 – max

相關問題