复选框使用Knockout绑定到两个对象

时间:2013-04-25 18:29:25

标签: javascript knockout.js knockout-2.0

我正在创建一个复选框列表。该列表是从此对象创建的:

this.definedRoles = ko.observableArray([]);

但是另一个对象应该检查哪些框。

this.userToAdd = {
        ID: ko.observable(""),
        FirstName: ko.observable(""),
        LastName: ko.observable(""),
        Active: ko.observable(""),
        Email: ko.observable(""),
        Roles: ko.observableArray([])//these are the values of the checkboxes
    };

我可以使用以下方式生成复选框:

<ul data-bind="foreach: $root.definedRoles" style="list-style:none;">
     <li>
         <label class="checkbox">
              <input type="checkbox" data-bind="value: Id" value="" />
              <span data-bind="text: Name"></span>
         </label>
     </li>
</ul>

每次我尝试使用

添加绑定来检查某些框
<input type="checkbox" data-bind="value: Id, checked: $root.userToAdd.Roles.Active" value="" />

没有结果。不确定如何应用此绑定。感谢

2 个答案:

答案 0 :(得分:1)

你可以做的是添加一个检查给定用户是否具有角色的函数,如下所示:

var User = function() {
    var self = this;
    self.ID = ko.observable(""),
    self.FirstName = ko.observable(""),
    self.LastName = ko.observable(""),
    self.Active = ko.observable(""),
    self.Email = ko.observable(""),
    self.Roles = ko.observableArray([])//these are the values of the checkboxes,

    self.IsRoleActive = function(role) {
        for(i=0; i<self.Roles().length; i++) { 
            if(self.Roles()[i] == role && self.Roles()[i].Active) {
                return true;
            }
        }
        return false;
    }
};

var userToAdd = new User(); 

然后你的绑定应该是这样的:

<input type="checkbox" 
       data-bind="value: Id, checked: $root.userToAdd.IsRoleActive"/>

当然,只有当RolesdefinedRoles都是字符串数组时,这一切才有效。

答案 1 :(得分:0)

由于角色是可观察的,你没有正确地称它为:

$root.userToAdd.Roles().Active

虽然它是一个数组,但.Active不会解决任何问题,我想过。

它只是一个字符串数组,详细说明了用户所处的角色吗?如果是,那么你需要做一些事情:

$root.userToAdd.Roles.indexOf(Name()) !== -1

查看数组是否包含角色的字符串。