0

これから変換するために、よりクリーンな URL にスラッグ URL を使用しています。

http://mydomain.com/#/posts/1

これに:

http://mydomain.com/#/posts/first-awesome-post

問題は、直接スラッグ URL ( http://mydomain.com/#/posts/first-awesome-post )を介してページに直接アクセスすると、代わりに空白のページが表示されることです。

ここに私が持っているものがあります:

App.Router.map(function() {
    this.resource('posts', function() {
        this.resource('post', { path: ':post_id' });
    });
});

App.Post.FIXTURES = [{
  id: 1,
  name: 'First Awesome Post',
  slug: 'first-awesome-post'
}];

App.PostRoute = Em.Route.extend({
    model: function(params) {
        return App.Post.find(params.post_id);
    },

    setupController: function(controller, model) {
        this._super.apply(this, arguments);
    },

    serialize: function(model, params) {
        return { post_id: model.get('slug')};
    },
});

私は次のことを試しました:

  • に置き換えparams.post_idて、次の URL をブラウザに入力しApp.PostRouterましたhttp://mydomain.com/#/posts/first-awesome-post ; 結果: ページ CSS と HTML はロードされますが、ID #1 のデータはロードされませんでした (つまり、モデル フックは呼び出されません)。params.post_slug
  • シリアル化機能を取り除き、ブラウザに次の URL を入力しましたhttp://mydomain.com/#/posts/1 ; 結果: すべて正常に動作します (CSS、HTML、およびデータが完全に読み込まれました)

この場合、私が何を間違っていたかを知ることができますか?

PS私は現在EmberJSバージョン1.0.0-rc.6を使用しています

4

1 に答える 1

1

スラッグを使用したい場合は、id http://emberjs.com/api/data/classes/DS.Store.html#以外の属性でモデルを検索しているため、モデル関数を変更して findQuery を使用する必要があります。 method_findQueryですが、この関数は RecordArray を返します。配列の唯一のオブジェクトを設定するために setupController フックを使用できます。

App.Router.map(function() {
    this.resource('posts', function() {
        this.resource('post', { path: ':post_slug' });
    });
});

App.Post.FIXTURES = [{
  id: 1,
  name: 'First Awesome Post',
  slug: 'first-awesome-post'
}];

App.PostRoute = Em.Route.extend({
    model: function(params) {
        return App.Post.findQuery({slug:params.post_slug});
    },
    setupController: function(controller, model) {
    //If the model comes from a link-to helper it will be an object, if it comes from the route it will be an array of one element
      if(Ember.isArray(model)){
        controller.set('model',model.get('firstObject'));
      }
      else{
        controller.set('model',model);
      }
    },

    serialize: function(model, params) {
        return { post_slug: model.get('slug')};
    },
});
于 2013-11-06T10:42:50.900 に答える