0

ルーター v2 を調べたところ、次のようにテンプレートへのフル パスを宣言する必要があることがわかりました。

WZ.ApplicationRoute = Em.Route.extend
  renderTemplate: ->
    @render('app/templates/nav/nav', outlet: 'nav')

テンプレート名プロパティを使用してビューを作成することはできますが、実際にはそうしたくありません。

次のようにテンプレートを定義する方法はありますか:

@render('nav', outlet: 'nav')
4

2 に答える 2

1

通常の環境では、テンプレートをレンダリングするときにフル パスを指定する必要はありません。Ember は何も魔法をかけていません。で指定された名前のテンプレートをチェックしますEmber.TEMPLATES。アプリを起動し、JS コンソールから次を試してください。

Ember.keys(Ember.TEMPLATES)

私の推測では、あなたのテンプレートはapp/templates/nav/navnav の代わりに下にあります。

これを修正する方法は、ハンドルバー テンプレートのコンパイルに何を使用しているかによって異なります。ほとんどのビルド システムでは、テンプレート名のベース パスを指定できます。

于 2013-01-27T03:19:57.353 に答える
0

Emberはその規則を使用して、直接の名前または名前へのパスのいずれかであるテンプレートを検索します。、と入力するだけの場合nav、emberはそれが名前であると見なします。

これに関する最良のドキュメントは常にソースコードであり、この場合は次のようになります(ファイル:packages / ember-routing / lib / system / route.js):

render: function(name, options) {
  if (typeof name === 'object' && !options) {
    options = name;
    name = this.routeName;
  }

  name = name ? name.replace(/\//g, '.') : this.routeName;

  var container = this.container,
      view = container.lookup('view:' + name),
      template = container.lookup('template:' + name);

  if (!view && !template) { return; }

  this.lastRenderedTemplate = name;

  options = normalizeOptions(this, name, template, options);
  view = setupView(view, container, options);

  appendView(this, view, options);
}

あなたの質問への回答はラインです

name = name ? name.replace(/\//g, '.') : this.routeName;

したがって、残り火のテンプレートの名前は、テンプレートに付ける名前か、すべてのスラッシュがドットに変換されるパスに基づく名前のいずれかです(残り火の慣例により)。

更新、2013年8月2日-コメントでの@sudhanshuの質問への回答

テンプレートのデフォルトの使用方法は、アプリケーションのルーターの構成です。

App.Router.map(function() {
  this.route("members");
  this.route("member",     { path: "/members/:refId" } );
  this.route("membernew",  { path: "/member/new" } );
});

上記の小さな例は、ルーターの3つの機能を示しています。

  • 「members」は単なる名前であり、規則を適用します。つまり、パスは定義されていません。したがって、emberjsは自動的にそのパス/membersを使用します。
  • 「member」は、リソースを識別して適切なメンバーをロードするために、動的URL部分を使用します。ここでは、パスを定義する必要があります。
  • 「membernew」もパスを定義します。これは、デフォルトのパスを使用したくないためです。/membernew

まったく同じ規則に従って、emberjsは、ルーターで定義した名前でテンプレートをロードしようとします。上記の例では、emberjsは、ハンドルバーテンプレートに「members」、「member」、および「membernew」という名前が付いていることを想定しています。

上記に示されていない機能は、ルートをリソースにカスケードすることです。http://emberjs.com/guides/routing/をご覧ください。emberjsチームは、このトピックに関する非常に優れたガイドを作成しました。

したがって、一般的にemberjsは、多くのコーディング行を回避できるいくつかの優れた規則に基づいています。ただし、規則に従う必要があります。より複雑なアプリケーションの場合、これは多くの場合不可能です。

于 2013-01-26T21:59:56.040 に答える