Ember.js路由——通过不同的模型进行过滤的最佳方式
Ember.js Routes - Best Way to Filter By a Different Model
我试图创建一个路由结构,在那里我可以查看所有成员(/成员)的列表或按组(members/group-slug-to-filter-by)过滤它们。我有一个成员模型和一个组模型,以及以下路由:
this.resource('members', function() {
this.route('/');
this.route('group', { path: ':group_slug' });
});
我的MembersGroup路由是这样的:
var MembersGroupRoute = Ember.Route.extend({
model: function(params) {
// Just have this here temporarily for testing purposes,
// but ultimately this is where I would filter by group slug
return this.store.find('member').then(function(models) {
return models.slice(0, 2);
});
},
serialize: function(model) {
return { 'group_slug': model.get('slug') };
}
});
实际上,我有一个项目符号列表显示每个组,以及一个我想传递组模型的链接:
<ul class="nav nav-pills nav-stacked">
{{#each group in groups}}
<li>{{#link-to 'members.group' group class="list-group-item"}}{{group.name}} <span class="badge">{{group.memberCount}}</span>{{/link-to}}</li>
{{/each}}
</ul>
这样做时,我为链接到帮助器提供了一个模型,因此它转换到成员。组路由而不执行模型钩子;这是一个问题,因为我不能接受传入的组模型,重新执行模型钩子,并通过组的段塞进行过滤。
如果我传入组段(作为字符串,而不是组模型),模型钩子被执行,列表被过滤:
<li>{{#link-to 'members.group' group.slug class="list-group-item"}}{{group.name}} <span class="badge">{{group.memberCount}}</span>{{/link-to}}</li>
实现这个功能的最好方法是什么?我应该重组我的路线,只是继续在组段传递,或者有一种方法可以让这个工作,而在组模型中传递?
我很确定我可以在链接上使用操作来通过组模型过滤,但我想让URL反映正在过滤的组(即。成员/group-slug)。
谢谢!
如果您通常会传入段塞,而不是经过过滤的组(可能是因为您无法访问链接到的经过过滤的组),请考虑将段塞作为路由的模型。在控制器级别,你会希望模型实际上是被过滤的组,你可以使用setupController
钩子来做到这一点。在这种情况下,你不需要定义model
或serialize
钩子,你的路由可以像下面这样:
var MembersGroupRoute = Ember.Route.extend({
setupController: function(controller, model) {
slug = model;
controller.set 'model', this.store.find('member', groupSlug: slug).then(function(models) {
return models.slice(0, 2);
});
}
});
那么你可以用上面提到的第二种方式调用你的路由:
<li>{{#link-to 'members.group' group.slug class="list-group-item"}}{{group.name}}
您也可以做类似的事情,并将未过滤的组作为模型钩子中的模型,并作为通过链接传递的内容,然后在设置控制器的模型之前使用setupController
钩子通过该组过滤成员。
也就是:
var MembersGroupRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('group', slug: params.group_slug)
},
serialize: function(model) {
return { 'group_slug': model.get('slug') };
},
setupController: function(controller, model) {
group = model;
controller.set 'model', this.store.find('member', group: group)
}
});
你用上面提到的第一种方式调用路由:
<li>{{#link-to 'members.group' group class="list-group-item"}}{{group.name}} <span class="badge">{{group.memberCount}}</span>{{/link-to}}</li>
相关文章:
- 使用 ng 模型按键入(键,值)对过滤
- Strongloop环回:根据相关模型的id进行过滤
- Angular:如何根据模型中过滤的元素数量隐藏DOM元素
- Ember.js 2如何过滤现有模型
- 如何在不破坏角度模型(数组)的情况下对其进行过滤
- 使用 ng 模型有条件地过滤 ng 选项
- 在 sencha 触摸 2 下的关联模型中进行过滤
- 主干.js中的过滤模型(不是集合)
- 多个模型成一条路由并过滤 Ember 选择
- 按模型中的类别过滤每个 - 余烬.js
- 角度 - 按模型值过滤 ng 重复
- 如何在 Emberjs 中仅返回过滤后的模型
- 如何使用强循环过滤包含“模型”中的数据
- Ember:按文本字段过滤模型
- 使用Knockback.js过滤中的视图模型集合
- 过滤掉选择选项后,角度模型无法更新
- Angularjs-我们如何观察ngRepeat中的动态元素,以及动态ng模型名称和ANY更改时的过滤元素值
- 用一个控制器中的模型过滤另一个控制器中的内容(AngularJS)
- 角度 - 按单个ng模型过滤,但具有多个属性
- 使用Derby.js进行客户端模型过滤