Ember.js路线映射

时间:2013-10-11 14:23:44

标签: javascript ember.js routes ember-router

我是ember.js的新手,我尝试在App.Router.map中为我的应用程序设置路由/资源,但是我在提出最有效/干扰方面遇到了一些麻烦定义应用程序所需路由的方法。

我希望有一个资源items,它是进入应用程序时的默认路径,它显示一个由动态细分:bucket过滤的项目列表,必须是一组预定义的存储桶名称。即#/items/foo#/items/bar,其中foobar是有效的:bucket值。

此外,items路由还应允许第二个段tag,然后必须跟随另一个动态段,该段是标记名称的url-safe版本,即{{1 }}

我的第一部分工作,使用:

#/items/tag/my-tag

但是,我无法弄清楚如何在那里放置App.Router.map(function() { this.resource('items', {path: '/items/:bucket'}); }); 版本的路线。我已经尝试将它嵌套在tag资源中,也作为自己的顶级资源,但都不起作用。

1 个答案:

答案 0 :(得分:2)

您可以像这样构建路由器:

App.Router.map(function() {
  this.resource('items', {path: '/items'}, function(){
    this.route('bucket', {path: '/:bucket'});
    this.route('tag', {path: '/tag/:tag'});
  });
});

这会显示Item处的所有#/items,并按#/items/bucketNameHere处的存储区和#/items/tag/tagNameHere处的标记进行过滤。

如果所有项目都显示在ItemRoute

App.ItemsRoute = Ember.Route.extend({
  model: function(){
      return this.store.find('item');
  }
});

然后,您可以在ItemsBucketRouteItemsTagRoute

中处理过滤
App.ItemsBucketRoute = Ember.Route.extend({
  model: function(params){
    console.log("model fired");
    return this.modelFor('items').filterProperty('bucket', params.bucket);
  }
});

App.ItemsTagRoute = Ember.Route.extend({
  model: function(params){
    return this.modelFor('items').filterProperty('tag', params.tag);
  }
});

您还可以完成列表过滤using the filterProperty of arrayControllers

JSBin Example