1

サーバーから返された HTML へのアドオンとして Ember アプリケーションを作成しています。この HTML が必要なのは、検索エンジンがサイトをインデックス化できるようにするためと、ユーザーの最初のページ レンダリングを高速化するためです。

したがって、私のアプリケーションは、サーバーによって生成された HTML のさまざまな DOM 要素に追加されたいくつかの Ember ビューで構成されています。ルートのマスター テンプレートは使用しないので、各ルートの renderTemplate 関数は何もしないように設定します。

私の Ember アプリは body 要素にバインドされており、カスタム ビューをツリーの下の要素に正常に追加できます。できます:

この JSFiddle では、リストの最後の 3 つの要素が Ember によって追加されます。

しかし、テンプレートで linkTo ヘルパーを使用しようとすると、エラーが発生します。

Uncaught TypeError: Cannot read property 'container' of null ember-latest.js:32224

これはこの関数にあります:

router: Ember.computed(function() {
     return get(this, 'controller').container.lookup('router:main');
}),

このJSフィドルでは、linkToをテンプレートに追加するだけで、すべてが壊れます

  1. 一般に、Ember はこのように機能しますか? サーバーによってレンダリングされた HTML に多くのビューが散らばっていますか?
  2. サンプルコードはどのように修正できますか?
4

2 に答える 2

2

ここでフィドルを修正しました。チェックしてください。

あなたは Ember の初心者のようです。
そこで、いくつかのヒントを紹介します。

  1. applicationルート テンプレートになり、すべてのテンプレートがレンダリングされるテンプレートが必要です 。
  2. viewsを使用してアクセスしないでくださいthis.container.lookup。デバッグ専用です。
  3. viewsDOM に追加するべきではありません。これはフレームワークの仕事です。
  4. デフォルトでは、アプリケーションは html の本文に追加されます。別の場所に追加するrootElement場合は、application. の設定については、こちらを参照してくださいapplication

    rootElement は、DOM 要素または jQuery 互換のセレクター文字列のいずれかです。ルート要素の外側の DOM に追加されたビューは、イベントを受け取らないことに注意してください。カスタム ルート要素を指定する場合は、その中にのみビューを追加するようにしてください。

  5. のようにグローバルにコントローラーにアクセスしないでください。ルート内のApp.itemsController.set("content", model)別のコントローラーにアクセスする場合は を使用し、別のコントローラー内にアクセスするには を使用します。 controllerthis.controllerForcontrollerneeds
  6. フレームワークApp.itemsController=Ember.ArrayController.extend({}).create();
    が これらすべてを処理します。

于 2013-09-09T16:45:56.237 に答える
0

このフィドルを機能させるには、ビューとコンテナをさらにバインドする必要があることがわかりました

  App.itemsView.set("controller", App.itemsController);
  App.itemsController.set("container", this.container);

したがって、結果の作業コードスニペットは次のとおりです。 http://jsfiddle.net/ddegtyarev/6cBRx/6/

繰り返しになりますが、私はハイブリッド Ember アプリケーションを構築しています。つまり、サーバーから直接返された HTML と、複数の場所にある複数の Ember ビューによって追加された HTML があります。これが、ビューを手動で作成し、コントローラーなどにバインドする必要がある理由です。

于 2013-09-13T18:24:10.087 に答える