2

したがって、Ember docs からの私の理解では、ビュー/コントローラー/モデルのパターンは次のとおりです。

[view] <- [controller] <- [model]

(モデルを消費するコントローラーを消費するビューを使用)

Ember を使用した以前の経験では、次のようにモデルを使用するビューを設定していました。

{{#with blogpost}}
    {{#view MyApp.BlogPostView contentBinding="this"}}
        <h1>{{title}}</h1>

        <p>{{content}}</p>
    {{/view}}
{{/with}}

ここで、コントローラーを作成するとします。

MyApp.BlogPostController = Ember.BlogPostController.extend()

このコントローラーをどこで初期化しますか?

Ember docs を見ると、コントローラーがrouteに関連付けられている場合、これは自動的に発生するように見えますが、ビューとモデルを結び付けるアドホックコントローラーが必要な場合はどうなりますか? これは、私のページの任意のコンポーネントである可能性があります。

コントローラーのインスタンス化は私に責任がありますか? ある種のcontrollerBinding属性を使用する必要がありますか? モデルまたはビューで自動的にインスタンス化されますか?

アドバイスをいただければ幸いです。Ember のモデル/ビュー パターンには慣れていますが、コントローラーがどこに収まるかを理解するのに苦労しています。

4

1 に答える 1

3

Ember docs を見ると、コントローラーがルートに関連付けられている場合、これは自動的に発生するようです

これは正しいです。ルートに関連付けられたコントローラーは、必要に応じて ember によって自動的にインスタンス化されます。

しかし、ビューとモデルを結び付けるアドホック コントローラーが必要な場合はどうすればよいでしょうか。これは、私のページの任意のコンポーネントである可能性があります。コントローラーのインスタンス化は私に責任がありますか? ある種の controllerBinding 属性を使用する必要がありますか? モデルまたはビューで自動的にインスタンス化されますか?

自分で行う必要なしに、任意のコントローラーを ember によって自動的にインスタンス化するには、さまざまな方法があります。

例として、 という名前のルートに関連付けられていないコントローラーがあると仮定しましょうLonelyController

App.LonelyController = Ember.ArrayController.extend({
  content: ['foo', 'bar', 'baz']
});

アプローチ1

ルートがあり、 にフックすると仮定しましょう。ここでこれsetupControllerをリクエストしようとすると、ember がそれをインスタンス化します。LonelyControllerthis.controllerFor('lonely');

App.IndexRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    this.controllerFor('lonely').get('content');
    // the above line will retrive successfully 
    // your `LonelyController`'s `content` property
  }
});

アプローチ 2

LonelyControllerember によって自動的にインスタンス化されるもう 1 つの方法はneeds、別のコントローラーで API を使用して依存関係を定義することです。

App.IndexController = Ember.ObjectController.extend({
  needs: 'lonely',
  someAction: function() {
    this.get('controllers.lonely').get('content');
    // the above line will retrive successfully 
    // your `LonelyController`'s `content` property
  }
});

API を使用すると、次のneedsようなこともできます。

App.IndexController = Ember.ObjectController.extend({
  needs: 'lonely',
  lonelysContentBinding: 'controllers.lonely.content',
  someAction: function() {
    this.get('lonelysContent');
    // the above line will retrive successfully 
    // your `LonelyController`'s `content` property
  }
});

上記の方法を組み合わせて自動的にインスタンス化する方法もいくつかありますがLonelyController、これは今ではもっと明確になっているはずです。

最後のヒント: ember が内部で自動的に作成するものの手がかりを得るには、生成ログを有効にしてコンソールでこれを観察することもできます。これは非常に役立ちます。

var App = Ember.Application.create({
  LOG_ACTIVE_GENERATION: true
});

それが役に立てば幸い。

于 2013-08-04T21:54:15.020 に答える