如何在多对多关系中使用复选框?
How to use checkboxes in a many-to-many relationship?
我有两个具有多对多关系的模型(角色、权限)。有一个权限列表,角色可以拥有其中的一些权限。我想为角色创建编辑页面并将权限添加为复选框列表。
编辑模板:
<form>
{{input type="text" placeholder="role name" value=name}}
<br />
{{#each permissions_list}}
<label>
{{input type="checkbox" name="permissions[]"}}{{name}}
</label><br />
{{/each}}
<button {{action 'save'}}>Edit</button>
</form>
型号:
var Role = DS.Model.extend({
agents: DS.hasMany('agent', {async: false}),
name: DS.attr('string'),
permissions: DS.hasMany('permission', {async: true})
});
var Permission = DS.Model.extend({
type: DS.attr('string'),
name: DS.attr('string'),
roles: DS.hasMany('permission', {async: false})
});
编辑角色控制器
export default Ember.ObjectController.extend({
permissions_list: [],
actions: {
save: function() {
return this.get('model').save();
}
},
load_permissions: function() {
this.set('permissions_list', this.store.find('permission'));
}.on('init')
});
问题:
- 如果此权限已在 model.permissions
中,我无法找到如何将复选框标记为已选中
- 我无法保存角色保存权限。控制器没有看到 "permissions" 数据(this.get('permissions')在编辑角色控制器中)
permissions - 权限列表,该角色包含
permissions_list - 数据库的所有权限列表
最直接的方法(恕我直言)是为复选框创建一个组件:
App.PermissionCheckboxComponent = Ember.Component.extend({
tagName: '',
checked: function(){
var permission = this.get('permission.name');
var rolePermissions = this.get('role.permissions').mapBy('name');
return rolePermissions.contains(permission);
}.property(),
save: function(){
var permissionChecked = this.get('checked');
var role = this.get('role');
var permission = this.get('permission');
var permissions = role.get('permissions');
if(permissionChecked){
role.get('permissions').addObject(permission);
permission.save();
role.save();
}
else {
role.get('permissions').removeObject(permission);
role.save();
}
}.observes('checked')
});
您的组件模板如下所示:
<script type="text/x-handlebars" id="components/permission-checkbox">
{{ input type='checkbox' checked=checked }} {{permission.name}}
</script>
然后您可以在您的编辑模板中使用此组件,如下所示:
<h2>Edit Permissions</h2>
<ul>
{{#each role in model.roles}}
<li>{{role.name}}</li>
<ul>
{{#each permission in model.permissions}}
<li>{{ permission-checkbox permission=permission role=role }}</li>
{{/each}}
</ul>
{{/each}}
</ul>
工作解决方案here
我有两个具有多对多关系的模型(角色、权限)。有一个权限列表,角色可以拥有其中的一些权限。我想为角色创建编辑页面并将权限添加为复选框列表。
编辑模板:
<form>
{{input type="text" placeholder="role name" value=name}}
<br />
{{#each permissions_list}}
<label>
{{input type="checkbox" name="permissions[]"}}{{name}}
</label><br />
{{/each}}
<button {{action 'save'}}>Edit</button>
</form>
型号:
var Role = DS.Model.extend({
agents: DS.hasMany('agent', {async: false}),
name: DS.attr('string'),
permissions: DS.hasMany('permission', {async: true})
});
var Permission = DS.Model.extend({
type: DS.attr('string'),
name: DS.attr('string'),
roles: DS.hasMany('permission', {async: false})
});
编辑角色控制器
export default Ember.ObjectController.extend({
permissions_list: [],
actions: {
save: function() {
return this.get('model').save();
}
},
load_permissions: function() {
this.set('permissions_list', this.store.find('permission'));
}.on('init')
});
问题:
- 如果此权限已在 model.permissions 中,我无法找到如何将复选框标记为已选中
- 我无法保存角色保存权限。控制器没有看到 "permissions" 数据(this.get('permissions')在编辑角色控制器中)
permissions - 权限列表,该角色包含
permissions_list - 数据库的所有权限列表
最直接的方法(恕我直言)是为复选框创建一个组件:
App.PermissionCheckboxComponent = Ember.Component.extend({
tagName: '',
checked: function(){
var permission = this.get('permission.name');
var rolePermissions = this.get('role.permissions').mapBy('name');
return rolePermissions.contains(permission);
}.property(),
save: function(){
var permissionChecked = this.get('checked');
var role = this.get('role');
var permission = this.get('permission');
var permissions = role.get('permissions');
if(permissionChecked){
role.get('permissions').addObject(permission);
permission.save();
role.save();
}
else {
role.get('permissions').removeObject(permission);
role.save();
}
}.observes('checked')
});
您的组件模板如下所示:
<script type="text/x-handlebars" id="components/permission-checkbox">
{{ input type='checkbox' checked=checked }} {{permission.name}}
</script>
然后您可以在您的编辑模板中使用此组件,如下所示:
<h2>Edit Permissions</h2>
<ul>
{{#each role in model.roles}}
<li>{{role.name}}</li>
<ul>
{{#each permission in model.permissions}}
<li>{{ permission-checkbox permission=permission role=role }}</li>
{{/each}}
</ul>
{{/each}}
</ul>
工作解决方案here