2016-08-12 19 views
0

私は、コントローラを使用してドロップダウンメニューで選択された値を読み込み、いくつかの入力フィールドのパラメータを取り込み、レコードを保存しています。それはレコードを作成し、情報をうまく取り込みます。私の問題は、アクションの終わりに別のページに移行しようとするときです。私はエラーを取得し続ける:Cannot read property 'transitionToRoute' of undefinedthis.transitionToRouteが私のコントローラで動作していませんEmber

私は完全に困惑しています。何か案は?ここで

は私のコントローラのコードである:ここで

var teamId; 
export default Ember.Controller.extend({ 
    auth: Ember.inject.service(), 
    actions: { 
     onSelectEntityType: function(value) { 
     console.log(value); 
     teamId = value; 
     return value; 
     }, 
     createProcess: function(processName, processDescription) { 
     var currentID = this.get('auth').getCurrentUser(); 
     let team = this.get('store').peekRecord('team', teamId); 
     let user = this.get('store').peekRecord('user', currentID); 
     let process = this.get('store').createRecord('process', { 
      team: team, 
      user: user, 
      name: processName, 
      description: processDescription 
     }); 
     process.save().then(function() { 
     this.transitionToRoute('teams', teamId); 
     }); 
    } 

    } 
}); 

は、対応するルートです:

export default Ember.Route.extend({ 
    auth: Ember.inject.service(), 
    model: function() { 
     var currentID = this.get('auth').getCurrentUser(); 
     return this.store.find('user', currentID); 
    } 
}); 
+4

'this'はコールバック関数内では定義されていません。これについてはここに何百もの投稿があります。これを回避する最も簡単な方法は '.then(()=> this.transitionToRoute'のようにarrow関数を使うことです。もう一つの方法は関数の先頭に' self'変数を設定してそれを使う方法です。 –

+0

一つの修正おそらく何千もの人がいるかもしれませんが、公正であるためには、おそらくJavaScriptを使用している人々がもっともよく抱える問題です。 – Kingpin2k

+0

これを見てください[answer](http://stackoverflow.com/questions/37097598/nesting-functions-in- js/37097783#37097783) – ykaragol

答えて

4

あなたはJavascriptでこのキーワードについて明確に理解している必要があります。このキーワードは、関数がどのように呼び出されたかに依存し、関数が定義された方法/時期/場所ではありません。

function foo() { 
    console.log(this); 
} 

// normal function call 
foo(); // `this` will refer to `window` 

// as object method 
var obj = {bar: foo}; 
obj.bar(); // `this` will refer to `obj` 

// as constructor function 
new foo(); // `this` will refer to an object that inherits from `foo.prototype` 

詳しくは、MDN documentationをご覧ください。

このを通常の変数thisにキャッシュし、コールバックの内部でアクセスすることができます。その本レキシカルスコープれる

var self = this; 

process.save().then(function() { 
    self.transitionToRoute('teams', teamId); 
}); 

のECMAScript 6導入矢印機能。ここでは、これは通常の変数のようにスコープ内で検索されます。

process.save().then(() => { 
    this.transitionToRoute('teams', teamId); 
}); 
+0

ありがとうございます。 –

関連する問題