2

ルートと関連するコントローラーによって設定されたビューがあります。コントローラが作成されたことを追跡できますが、init()これを行うと、ビューの機能で次のようになります。

init: function() {                  
  this._super();                     
  console.log(this.get('controller'));
}

コントローラはnullです。チェックインするdidInsertElement()と、コントローラーが設定されます。init()すでにコントローラーが機能していると便利だと思います。なぜそうではないのですか?

4

1 に答える 1

2

これが当てはまるのは、ビューが作成されたときにinit()が呼び出されるためです(= Emberオブジェクト)。どこかでEmberは次のようなことをします。次に、initが呼び出されます。

var view = Ember.View.create({}); 

この時点では、コントローラーは割り当てられていません。コントローラは後で割り当てられます。ほとんどの場合、これはあなたのルートによってダウンしています。ルートのレンダリングコードからこのコードを見てください。

function setupView(view, container, options) {
  var defaultView = options.into ? 'view:default' : 'view:toplevel';

  view = view || container.lookup(defaultView); // the view gets created here and init gets called

  if (!get(view, 'templateName')) {
    set(view, 'template', options.template);

    set(view, '_debugTemplateName', options.name);
  }

  set(view, 'renderedName', options.name);
  set(view, 'controller', options.controller); // controller gets assigned to view

  return view;
}

ご覧のとおり、最初にビューがインスタンス化され、その後、コントローラーがビューに割り当てられます。

なぜEmberはそのようにするのですか?間違っていませんか? あなたの現在の理解は、あなたのビューに接続されたコントローラーが常にあるということです。しかし、これは常に当てはまるわけではありません。たとえば、{{view}}ヘルパーについて考えてみてください。通常、contextBindingを使用して設定します。したがって、「controller」プロパティは常に設定されているわけではありません。

あなたはあなたの場合何をすべきですか? 要件の概要は詳しく説明していませんが、willInsertElement()フックを使用すれば問題ありません。これは、要素がDOMに含まれる前です。それはそれにアクセスするのに十分早いはずですよね?

于 2013-03-07T14:31:26.107 に答える