2

プロジェクトを古いバージョンの EmberJS から移行しています。一部の場所では、ビューの init() メソッドで以下を使用して、ビューに関連しないコントローラー インスタンスを取得していました。

var controller = App.get('router').get('firstController');

しかし、これは次のエラーをスローします。

  Uncaught TypeError: Cannot call method 'get' of undefined 

これは、Router オブジェクトを取得できないことが原因である可能性があります。ビューに関係のないコントローラーインスタンスを取得するにはどうすればよいですか? またはルーターオブジェクトを取得する方法

4

1 に答える 1

3

「ニーズ」機能により、コントローラーは他のコントローラーにアクセスできるようになり、コントローラーのビューが他のコントローラーにアクセスできるようになります。(Ember のニーズについての適切な説明: http://darthdeus.github.com/blog/2013/01/27/controllers-needs-explained/ )

Cannot access Controller in init function in View in 1.0.0rc で説明されているように、ビューのcontrollerプロパティは が呼び出された時点ではまだ設定されていないため、ビューのライフ サイクルの後半でinit()アクセスする必要があります。controllerこれは、たとえば、willInsertElement()またはフックである可能性があります。didInsertElement()

ビューからニーズにアクセスする別のコントローラーを使用する例を次に示します。

http://jsbin.com/ixupad/186/edit

App = Ember.Application.create({});

App.ApplicationController = Ember.Controller.extend({
  doSomething: function(message) {
    console.log(message);
  }
});

App.IndexView = Ember.View.extend({
  templateName: 'index',
  init: function() {
    this._super();
    // doesn't work, controller is not set for this view yet see:
    // https://stackoverflow.com/questions/15272318/cannot-access-controller-in-init-function-of-view-in-1-0-0rc
    //this.get('controller.controllers.application').doSomething("from view init");
  },
  willInsertElement: function() {
    this.get('controller.controllers.application').doSomething("from view willInsertElement");
  },
  clickMe: function() {
    this.get('controller.controllers.application').doSomething("from clickMe"); 
  }
});

App.IndexController = Ember.Controller.extend({
  needs: ['application']
});
于 2013-03-11T13:21:37.127 に答える