Ember-data添加不必要的记录

时间:2014-08-23 20:17:56

标签: ember.js ember-data

让我们说我有一个关于动漫的应用程序.. 我希望能够使用以下任何网址访问相同的动漫:
/a/foo/1
/a/foo
/a/1
所以我的路由器定义如下:

// router.js
Router.map(function() {
    this.resource('animes', { path: '/a/' }, function() {
        this.route('add');
        this.route('remove');
    });
    this.resource('anime', { path: '/a/:anime_id' });
    this.resource('anime', { path: '/a/:slug/:anime_id' }, function() {
        this.route('edit');
    });
});

我的anime route看起来像这样:

// routes/anime.js
var AnimeRoute = Ember.Route.extend({
        afterModel: function(anime, transition) {
            // redirect to the url /a/foo/1
        if(anime.get('slug') !== transition.params.anime.slug) {
            this.replaceWith('anime', anime);
        }
    },
    serialize: function(anime) {
        return {
            slug: anime.get("slug"),
            anime_id: anime.get("id")
        };
    } 
});

export default AnimeRoute;

我的后端配置为返回正确的数据,无论发送的是id还是slug 对于/a/foo/1/a/1形式的网址,没有问题,但对于网址:/a/foo的情况,余烬检查员会显示&#39} ; s另外记录{id: foo, title: undefined, slug: undefined, ...: undefined}
如何解决这个问题?

编辑:这是一个说明问题的jsbin:http://emberjs.jsbin.com/rasewowapocu/2

1 个答案:

答案 0 :(得分:1)

因为你有this.resource('动漫',{路径:' / a /:anime_id'});在你的路线图中,/ a / foo将匹配这个,并假设foo是一个id。由于您的后端无论发送什么都会返回数据,这可能会让事情变得混乱。我想如果您像这样覆盖AnimeRoute的模型函数它应该可以工作:

App.AnimeRoute = Ember.Route.extend({
        model: function(params) {          
          var slug_or_id = params.anime_id;
          if(jQuery.isNumeric(slug_or_id)){ //id
                  return this.store.find('anime',slug_or_id);    
          }else{ //slug
                  return this.store.find('anime', { slug: slug_or_id }).then(function(a) {                      
                           return a.get('firstObject');
                  });   
          }          
    },
    afterModel: function(anime, transition) {
                // redirect to the url /m/foo/1
            if(anime.get('slug') !== transition.params.anime.slug) {
                this.replaceWith('anime', anime);
            }..

编辑:添加iguider提示仅返回第一个对象。