经过一番修修补补,我有一个解决方案给你,虽然这不是一个微不足道的改变。
我尝试了一些调整你所拥有的东西,但很明显我需要以不同的方式处理这个问题。
因此,我首先将视图模型的填充与视图模型的定义分开。
这是视图模型定义:
var AppViewModel = function() {
var self = this;
//list of client users
self.users = ko.observableArray();
//list of permissions available to this client
self.permissions = ko.observableArray();
//user to display in details area
self.currentUser = ko.observable();
//select user from the master list
self.selectUser = function(u) {
self.currentUser(u);
};
}
这与您所拥有的相同,只是该函数不希望传入数据。
这个视图模型的绑定现在看起来像这样:
var viewModel = new AppViewModel();
ko.applyBindings(viewModel);
addPermissions(initialData.PermissionList);
addUserAccounts(initialData.UserList);
当然,addPermissions
andaddUserAccounts
函数的细节在我得到的小提琴中,稍后我会提供指向它的链接。
让我首先讨论是否选中复选框的绑定解决方案。
我查看了有关使用 checked 的文档,我注意到在其中一个示例中,绑定值是一个数组。
因此,为了利用这一点,我创建了一个UserAccount
类:
var UserAccount = function() {
var self = this;
self.id = ko.observable();
self.email = ko.observable();
self.clientId = ko.observable();
self.firstName = ko.observable();
self.lastName = ko.observable();
self.createdBy = ko.observable();
self.userPermissions = ko.observableArray();
};
当 aUserAccount
添加到视图模型时,它使用以下函数:
var addUserAccount = function(data) {
var userAccount = new UserAccount();
userAccount.id(data.UserId);
userAccount.email(data.UserEmail);
userAccount.clientId(data.ClientId);
userAccount.firstName(data.FirstName);
userAccount.lastName(data.LastName);
userAccount.createdBy(data.CreatedBy);
for(var i = 0; i < data.UserPermissions.length; i++) {
var permissionIdAsString = String(data.UserPermissions[i].PermissionId);
userAccount.userPermissions.push(permissionIdAsString);
}
viewModel.users.push(userAccount);
};
请注意此函数中的 for 循环,它只是将 UserPermissions 数组中的每个 PermissionId 值添加userPermissions
到UserAccount
.
另请注意,现在每个可用权限都由以下Permission
类的实例表示:
var Permission = function() {
var self = this;
self.id = 0;
self.name = '';
self.description = '';
};
[这些Permission
属性的值不会在这里改变,所以不需要制作那些 observables。]
现在,鉴于所有这些背景,这就是我绑定复选框的方式,以便检查正确的复选框:
<ul data-bind="foreach: $root.permissions">
<li>
<label>
<input type="checkbox"
data-bind="value: id, checked: $parent.userPermissions" />
<span data-bind="text:name" />
</label>
</li>
</ul>
此代码出现在with: currentUser
块内,所以$parent
是 currentUser
这是包含我的解决方案的小提琴的链接:http: //jsfiddle.net/jimmym715/eByAa/
哦,我在视图中添加了以下代码,以确认userPermissions
每次选中/取消选中复选框都会更新。
我希望这个解决方案适合您的需求。如果您有任何问题,请告诉我。