2012-08-24 42 views
0

我正在学习淘汰赛,并试图构建将构建可选用户列表的页面。 JSFiddle:http://jsfiddle.net/Just/XtzJk/3/(我无法获得正确的数据分配)。淘汰赛复选框绑定选定的值

的数据分配,是在我的网页工作,我做给控制装置的呼叫,像下面并将其绑定到该控件预期

$.getJSON("/Wizard/GetUsers",function(allData){ 
     var mappedUsers = $.map(allData.AllUsers, function(item){return new User(item)}); 
     self.AllUsers(mappedUsers); 
     if(allData.SelectedUsers != null){ 
     var mappedSelectedUsers = $.map(allData.SelectedUsers, function(item){return new User(item)}); 
     self.SelectedUsers(mappedSelectedUsers);} 
    }); 

问题:

一)出了什么问题。我写的JSFiddle? 得到它的工作。

b)在我的代码中,我能够获得选定复选框的功能,但我无法获得存储在我在函数中收到的“用户”参数中的值。在Chrome JS控制台中,我可以看到用户对象存储了正确的值,但我无法检索它。 通过做ko.toJS()得到了这个。

谢谢。

编辑: 好的,我得到了我的JSFiddle工作,我不得不在框架中选择Knockout.js。更新后的小提琴:http://jsfiddle.net/Just/XtzJk/5/

此外,为获得所选checkboxe的价值我做

ko.toJS(user).userName 

但我想我会采取从列表中选择值的方式,然后点击将其移动到另一个“选定“列表并从先前的列表中删除这些值。得到了这个职位这样的想法:KnockoutJS: How to add one observableArray to another?

回答

7

OK,我想我已经得到了你所需要的解决方案...

我开始通过建立的selectedUserNames可观察到的数组,我申请这给<li>元素像这样:

<input type="checkbox" 
     name="checkedUser" 
     data-bind="value: userName, checked:$root.selectedUserNames" /> 

[注:它宣布checked绑定,这把我一个位之前申报value很重要...亚每天学习新的东西!]

为什么要将一个userName值数组绑定到已检查的绑定?那么,当一个数组被传递给checked绑定时,KO会将每个复选框的值与checked数组中的值进行比较,并检查其值在该数组中的任何复选框。 (大概解释了KO documentation更好)

然后,当我离开了observableArray为SelectedUsers,我成立了一个手动订阅来填充它,像这样:

self.selectedUserNames.subscribe(function(newValue) { 
    var newSelectedUserNames = newValue; 
    var newSelectedUsers = []; 
    ko.utils.arrayForEach(newSelectedUserNames, function(userName) { 
     var selectedUser = ko.utils.arrayFirst(self.AllUsers(), function(user) { 
      return (user.userName() === userName); 
     }); 
     newSelectedUsers.push(selectedUser); 
    }); 
    self.SelectedUsers(newSelectedUsers); 
}); 

[我本来试图建立selectedUserNames具有读取和写入功能的依赖可观察(ko.computed),但复选框没有。]

此订阅功能检查新selectedUserNames阵列,查找从AllUsersuserNameselectedUserNames阵列中的值相匹配的用户,并推动User对象匹配的SelectedUsers阵列......好吧,其实它推动每个匹配的User到临时数组,然后该临时数组被分配到SelectedUsers,但目标得到满足。 SelectedUsers数组现在总是包含我们想要包含的内容。

哦,我差点忘了......这里是我创造了小提琴,所以你得到了完整的解决方案:http://jsfiddle.net/jimmym715/G2hxP/

希望这会有所帮助,但让我知道,如果您有任何疑问

+0

正如我更新了我问题(在看到你的帖子之前),我结束了使用这样的东西http://jsfiddle.net/Just/5gxvd/ 但是,你的小提琴看起来更复杂,我会研究它,以了解它的作用。如果我什么都不懂,也许会发表更多的问题作为评论。谢谢你的帮助。 – Justin

+0

'value:'和'checked:'的顺序无关紧要(绑定集合中每个绑定的应用顺序不是确定性的) - 但它们都必须为此行为指定。 – user2246674