2013-12-20 63 views
0

我在Meteor項目的服務器/服務器目錄中有一個名爲authServices.coffee的文件。它具有以下功能定義,隨後Meteor.methods電話:爲什麼不在Meteor中調用此服務器方法?

isAuthorized =() -> 
    # note that at this point there is ever to be but one authorized user 
    authorized = Assets.getText('authorizedUsers').trim() 
    this.userId.trim() is authorized 

這不工作 - 也就是說,調用Meteor.call 'getKey'返回undefined

Meteor.methods(
    isAuthorized : isAuthorized 
    getKey :() -> 
    if isAuthorized() 
     Assets.getText('Key') 
) 

,但如果我內聯isAuthorized上述getKey內,它返回true(給出正確的輸入)

我猜這是this如何表現f或這些對象,但不能完全掌握它。

+0

難道你不需要在發佈函數和方法以外的任何地方使用Meteor.userId而不是this.userId嗎? –

+0

將'this'改爲'authorizedUsers'中的'Meteor.userId'我得到'throw new Error(「Meteor.userId只能在方法調用中調用,在發佈函數中使用this.userId。 // 17' – Ben

回答

1

功能isAuthorized,並getKey具有不同的上下文中的方法。最簡單的辦法是剛剛實現getKey像這樣:

getKey: -> 
    if Meteor.call 'isAuthorized' 
    Assets.getText 'Key' 

另外,您可以手動使用callapply通過this,或者你可以通過@userId作爲參數傳遞給isAuthorized功能。

樣式點:當使用CS時,當函數不帶參數時,不需要空的parens。

+0

我不需要......但他們看起來更好。 – Ben

0

這是一個選項嗎?

isAuthorized = (userId) -> 
    # note that at this point there is ever to be but one authorized user 
    authorized = Assets.getText('authorizedUsers').trim() 
    userId.trim() is authorized 

Meteor.methods(
    isAuthorized :() -> 
     isAuthorized(this.userId) 
    getKey :() -> 
     if isAuthorized(this.userId) 
      Assets.getText('Key') 
) 
+0

是的,這實際上是我在實施方面最終達成的目標。我正在尋找一個關於'this'的好解釋,以及它在這裏的表現。 – Ben

+0

請參閱[這個問題](http://stackoverflow.com/questions/17558635/javascript-nested-function-losing-scope)。 –

相關問題