2

handlebars テンプレートで linkTo ヘルパーを使用する場合、Ember はルートに追加したシリアライザーを使用してリンクの正しい URL を設定します。

serialize: function(slug, params) {
    var name, object;
    object = {};
    name = params[0];
    object[name] = slug;
    return object;
}

リンクをクリックすると、Ember は正しいスラッグなどを含む正しいページに遷移しますが、正しいデータがなく、そのように表示されます。これは、linkTo ステートメントに 2 番目のパラメーターとして渡すのは、モデル全体ではなく単なるスラッグであるためだと思います。

linkTo ステートメントに渡されたモデル (そうではない) に依存するのではなく、アドレスバーに URL を入力した場合と同じように、Ember にデータを取得させることは可能ですか?

更新 ルートのアクティブ化メソッド内でこれを試しましたが、これが完了するまでレンダリングを待たなければならないことが問題のようです。

activate: function() {
    this.context.isLoaded = false;
    this.model(this.context.query.slug);
}

何か案は?たぶん、よりきれいなソリューションでも?

4

2 に答える 2

4

IRCの何人かの助けを借りて、私が最後に思いついた解決策は、あなたが言及したようにsetupControllerフック、Darshan、および次のようなシリアライザーを使用することでした:

CustomRoute = Ember.Route.extend({
    setupController: function(controller, model) {
        var modelName = this.routeName.substr(0, 1).toUpperCase() + this.routeName.substr(1),
            slug = model;
        if (model.hasOwnProperty('slug'))
            slug = model.slug;
        controller.set('model', App[modelName].find({'slug': slug}));
    },
    serialize: function(slug, params) {
        var name, object;
        object = {};
        name = params[0];
        object[name] = slug;
        return object;
    }
});

このようにして、モデルの代わりに linkTo ヘルパーの 2 番目のパラメーターとしてルートのスラッグのみを指定できます。シリアライザーは URL を適切に設定し、setupController はモデルにプロパティslugがあるかどうかを確認します。正しくない場合は、モデルが単なるスラッグであると推測し、DS.Model.find メソッドを使用して promise をコントローラーのモデル ストアに返します。

setupController はルートが入力されるたびに呼び出されるため、モデル フックは時々しか呼び出されないため、DS.Model.find メソッドはプロミスを介してデータを取得するために毎回使用され、出来上がり - ルートに入るたびにデータを取得します。 .

これは、Ember.Data を使用し、モデル オブジェクトが大文字で始まる App.*ルート名* と呼ばれていることを前提としていますが、必要に応じて簡単に変更できます。

アプリ内のすべてのルートについて、このルートからサブクラス化 (拡張) するようになり、すべてのルートで目的の動作が得られます。

于 2013-06-29T12:17:23.383 に答える
0

findQueryルートでスラッグ名を使用してから、代わりに を使用してルートのデータをロードすることができますfind

App.Router.map(function() {
  this.resource('product', { path: '/product/:slug' });
});

App.ProductRoute = Ember.Route.extend({
  model: function(params) {
    return App.Product.query({name:params.slug});
  }
});
于 2013-06-27T12:28:38.277 に答える