如果您愿意手动同步服务器和客户端上的枚举(使用 AJAX 或 WebSockets),则可以使用普通的 Ember.js 来实现处理 Ember 对象和复选框之间的双向绑定的通用方法,而无需任何插件. 请注意,Ember 可以在同步后使用 Checkbox 自动更新选项列表。
所以从今以后,我假设你有一个枚举,角色是一个 Ember 数组:
App.Roles = [ "USER", "ADMIN", "GUEST" ];
然后我们将像这样在CollectionView中显示用户可用的选项(模板如下所示)。
OptionsView = Em.CollectionView.extend({
contentBinding: 'App.Roles', // Show a list of _all_ available roles
userBinding: 'App.User', // This points to the active user
tagName: 'ul', // Shown as a <ul>
itemViewClass: Em.View.extend({
userBinding: 'parentView.user', // For convenience
templateName: 'user-roles' // Defined later
})
});
每个选项的模板是:
<script data-template-name="user-roles" type="text/x-handlebars">
<label> {{view App.RoleCheckbox
contentBinding="view.content"}}
{{view.content}}
</label>
</script>
请注意,<label>
标签的使用确保 Checkbox 的click
事件在单击标签上的任意位置时被触发。
最后App.RoleCheckbox
是Ember.Checkbox
类的扩展,它处理checked
属性和click
事件来切换角色:
App.RoleCheckbox = Em.Checkbox.extend({
userRolesBinding: 'parentView.user.roles', // Points to the roles of the user
checked: function () {
var userRoles = this.get('userRoles');
return userRoles.contains(this.get('content'));
}.property('content', 'userRoles.@each'),
click: function (evt) {
var isPresent = this.get('checked'),
userRoles = this.get('userRoles'),
role = this.get('content');
if (!isPresent) {
userRoles.pushObject(role);
} else {
userRoles.removeObject(role);
}
}
});
一个工作示例是: http: //jsfiddle.net/BLQBf/(查看控制台以查看日志消息)
请注意,这并不完全是 Ember 式的,因为 View 正在做部分工作,这意味着controller
. 理想情况下,该click
事件将调用一个函数,该函数RoleCheckboxController
将对对象进行更改User
。