4

「/services」と「/services/:service」という 2 つのルートを持つアプリケーションがあるとします。

ユーザーが :service 状態にアクセスしたときに、ある特定のサービスに関する情報のリストを表示してもらいたいと思います。これまでのところ、些細なことです。

ただし、同じユーザーが /services にアクセスすると、サービスのリストと、サービスごとの情報 (すべてのサービス)を表示したいと考えています。また、テンプレートを複製せずにこれを行いたいと思います。

明らかな答えはアウトレットのように見えましたが、すべてのアウトレットに静的な名前を付ける必要があるようで、以前は不明な数のアウトレットがありました。それらはすべて固有の名前を持っていますが、もちろん、テンプレートに名前をハードコードすることはできません。アウトレット名を動的に決定したいので、renderTemplate で this.render を適切に呼び出してそれらを埋めることができますが、その方法がわかりません。

何を提案しますか?

更新: {{template}} を使用して特定のケースを処理できるようですが、それは別のルートに接続していません。その方法を知りたいです。後でもっと複雑なことをするつもりですが、それは間違いなくより適切であり、それぞれのコントローラーにはまだコードの重複があります。

更新:私は最終的に独自の「dynOutlet」ヘルパーを作成しました。

// Define "dynamic outlets". These are just like normal outlets,
// except they dereference the outlet name.
Handlebars.registerHelper('dynOutlet', function(property, options) {
  Ember.assert("Syntax: {{dynOutlet <property>}}", arguments.length === 2);
  var context = (options.contexts && options.contexts[0]) || this,
      normalized = Ember.Handlebars.normalizePath(
        context, property, options.data),
      pathRoot = normalized.root,
      path = normalized.path,
      value = (path === 'this') ? pathRoot : Ember.Handlebars.get(
        pathRoot, path, options);
  return Ember.Handlebars.helpers.outlet(value, options);
});

ただし、それが希望どおりに機能するかどうかはまだわかりません。

4

1 に答える 1

1

また、動的なアウトレットを定義する必要がありました。これは私が実装したヘルパーです:

Ember.Handlebars.registerHelper('dynamicOutlet', function(property, options) {
    var outletSource;

    if (property && property.data && property.data.isRenderData) {
      options = property;
      property = 'main';
    }

    outletSource = options.data.view;
    while (!(outletSource.get('template.isTop'))){
      outletSource = outletSource.get('_parentView');
    }

    options.data.view.set('outletSource', outletSource);

    var firstContext = options.contexts.objectAt(0);

    options.hash.currentViewBinding = '_view.outletSource._outlets.' + firstContext.get(property);

    var controller = App.__container__.lookup("controller:movies");
    options.contexts.clear();
    options.contexts.addObject(controller);
    return Ember.Handlebars.helpers.view.call(controller, Ember.Handlebars.OutletView, options);
});

これは、テンプレートで使用する方法です。

<div>
  {{title}} <!-- accessing title property of context -->
  {{dynamicOutlet outletName}} <!-- accessing the property that should be used as name of the outlet -->
</div>

ヘルパーを使用すると、モデルのプロパティをアウトレット名として使用できます。

于 2013-02-20T19:15:55.323 に答える