2

(この質問はこのjsbinに関連しています)

次のルーター構成があります。

App.Router.map(function() {

    this.resource('profile', function () {
        this.route('user');
        this.route('userEdit');
        this.route('company');
        this.route('companyEdit');
        this.resource('products', function () {
            this.route('index');
            this.route('show',   { path: '/:product_id/show' });
        });
    });

});

これにより、ember データは次のコントローラーを想定します。

  • ProfileIndexController
  • ProfileUserController
  • ProfileUserEditController
  • プロフィール会社コントローラー
  • ProfileCompanyEditController

次のルート:

  • プロフィールルート
  • プロファイル インデックス ルート
  • プロファイル ユーザー ルート
  • ProfileUserEditRoute
  • プロフィール会社名ルート
  • プロフィール会社編集ルート

そして、次のテンプレート:

  • 索引
  • プロフィール
  • プロファイル/インデックス
  • プロフィール/ユーザー
  • プロフィール/ユーザー編集
  • プロフィール/会社
  • プロフィール/会社編集

しかし、ネストされたリソース プロファイル/製品に対処できません。私はコントローラーを次の場所に期待していました:

  • プロファイル製品コントローラ
  • ProfileProductsIndexController
  • プロファイル製品表示コントローラ

ルート:

  • プロフィール商品紹介ルート
  • プロフィール製品表示ルート

テンプレートは次の場所にあります。

  • プロフィール/製品
  • プロフィール/製品/インデックス

代わりに、へのリンクをたどること#/profile/products/indexで、ember は次のオブジェクトを生成しています。

generated -> route:products Object {fullName: "route:products"}
generated -> route:products.index Object {fullName: "route:products.index"}
generated -> controller:products Object {fullName: "controller:products"}
Could not find "products" template or view. Nothing will be rendered Object {fullName: "template:products"}
generated -> controller:products.index Object {fullName: "controller:products.index"}
Could not find "products.index" template or view. Nothing will be rendered Object {fullName: "template:products.index"}
Transitioned into 'profile.products.index

これは予想外でした: 製品はプロファイル内にネストされています! もちろん、コントローラー/ルート/テンプレートを変更することもできますが、何が起こっているのかを理解したいと思います. 私が見ている問題は、最上位の「製品」がネストされた「プロファイル/製品」と競合することです。

オブジェクト名 (ルート/ビュー/テンプレート/コントローラー) の生成に関して、ember はネストされたリソースをどのように処理しますか。これはどこに文書化されていますか? (特にネストされたリソースの場合!)

4

2 に答える 2

5

ご自身の質問にお答えいただいたことは承知しておりますが、さらに詳しい情報を提供できるかもしれません。

この素晴らしい記事をチェックしてください。これは、Ember のネストされたリソースとルートの素晴らしい説明です。

要約すると、呼び出すときはいつでもthis.resource()(あなたの場合、呼び出し自体がネストされている場合でもthis.resource('products')、新しい名前空間を作成しています。

これは、 へのネストされた呼び出しが、ではなく、および (およびテンプレート)resourceを生成することを意味します。関連付けられたテンプレートには、その子をレンダリングするための が必要です。ProductsControllerProfileProductsControllerProductsViewproductsProfileProductsView{{outlet}}

さらに、(およびテンプレート)this.resource('products')が作成されるため、ネストされた呼び出しをプロジェクト リソースから削除できます。ProductsIndexControllerproducts.indexthis.route('index')

于 2013-08-23T12:49:04.850 に答える
0

この長い質問を書いた後、これが文書化された機能であることに気付きました。

トップレベルのリソースと同じ名前のネストされたリソースがある場合にどうなるかは、まだ不明です。それが衝突の原因になると思います。ember はここで、「製品」は 1 種類しかないと仮定しすぎていると思いますが、必ずしもそうである必要はありません。

于 2013-08-22T13:46:21.343 に答える