使用knockoutjs中的复选框列表

时间:2011-07-18 16:29:34

标签: javascript html mvvm checkbox knockout.js

我正试图绕过Knockout.js,而且在复选框方面我很困惑。

服务器端我正在填充一组带有相应值的复选框。现在,当选中任何未选中的复选框时,我需要将其值存储在逗号分隔的字符串中。如果未选中它们,则需要从字符串中删除该值。

有没人知道如何用knockoutjs实现这个目标?

到目前为止,我有以下代码:

视图模型:

$().ready(function() {
   function classPreValue(preValue)
   {
       return {
            preValue : ko.observable(preValue)
       } 
   }

   var editOfferViewModel = {
   maxNumOfVisitors : ko.observable(""),
   goals : ko.observable(""),
   description : ko.observable(""),
   contact : ko.observable(""),
   comments : ko.observable(""),
   classPreValues : ko.observableArray([]),
   addPreValue : function(element) {
      alert($(element).val());
      this.classPreValues.push(new classPreValue(element.val()));
   }
 };

 ko.applyBindings(editOfferViewModel);
});

我的复选框中填充了foreach循环:

<input data-bind="checked: function() { editOfferViewModel.addPreValue(this) }"
       type="checkbox" checked="yes" value='@s'>
    @s
</input>

我尝试将checkbox元素作为参数传递给我的addPreValue()函数,但是当我选中复选框时似乎没有任何事情发生?

非常感谢任何帮助/提示!

2 个答案:

答案 0 :(得分:20)

检查的绑定期望传递一个可以读/写的结构。这可以是变量,可观察或可写的dependentObservable。

当传递数组或observableArray时,检查的绑定确实知道如何从数组中添加和删除简单值。

这是一个示例,它还包含一个计算的observable,它包含数组作为逗号分隔值。 http://jsfiddle.net/rniemeyer/Jm2Mh/

var viewModel = {
    choices: ["one", "two", "three", "four", "five"],
    selectedChoices: ko.observableArray(["two", "four"])
};

viewModel.selectedChoicesDelimited = ko.computed(function() {
    return this.selectedChoices().join(",");
}, viewModel);

ko.applyBindings(viewModel);

HTML:

<ul data-bind="template: { name: 'choiceTmpl', foreach: choices, templateOptions: { selections: selectedChoices } }"></ul>

<script id="choiceTmpl" type="text/html">
    <li>
        <input type="checkbox" data-bind="attr: { value: $data }, checked: $item.selections" />
        <span data-bind="text: $data"></span>
    </li>
</script>

答案 1 :(得分:2)

为什么没有相互独立的复选框示例在线某处

由于此链接首先出现在我搜索互斥复选框时,我将在此处分享我的答案。我竭尽全力将头撞在墙上。顺便说一句,当您在绑定内联knockoutjs中处理click事件时,它似乎断开绑定(可能只是因为我试图调用我的resetIllnesses函数,如下所定义),即使从函数返回true也是如此。也许有更好的方法,但在此之前跟随我的领导。

这是我需要绑定的类型。

var IllnessType = function (name,title) {
    this.Title = ko.observable(title);
    this.Name = ko.observable(name);
    this.IsSelected = ko.observable(false);
};

要与之绑定的数组。

model.IllnessTypes = ko.observableArray(
    [new IllnessType('IsSkinDisorder', 'Skin Disorder'),
        new IllnessType('IsRespiratoryProblem', 'Respiratory Problem'),
        new IllnessType('IsPoisoning', 'Poisoning'),
        new IllnessType('IsHearingLoss', 'Hearing Loss'),
        new IllnessType('IsOtherIllness', 'All Other Illness')]
);

重置疾病可以清除所有疾病。

model.resetIllnesses = function () {
    ko.utils.arrayForEach(model.IllnessTypes(), function (type) {
        type.IsSelected(false);
    });
};

标记

<ul data-bind="foreach:IllnessTypes,visible: model.IsIllness()">
    <li><label data-bind="html: Title"></label></li>
    <li><input class="checkgroup2" type="checkbox" 
data-bind="attr:{name: Name },checked:IsSelected" /></li>
</ul>

这不起作用

如果你一直在努力尝试调用resetIllness函数,我会感到很痛苦。

<input type='checkbox' data-bind="checked:IsSelected, 
  click: function() { model.resetIllnesses(); return true; }" />

你一直在分享我的痛苦。好吧,它的作品!当你从下面的例子中调用它时。 请注意,我在上面添加了一个类,以便我可以添加click函数。

使您的所有问题都消失的脚本。

<script type="text/javascript">
    $(function() {
        $(".checkgroup2").on('click', function() {
            model.resetIllnesses();
            var data = ko.dataFor(this);
            data.IsSelected(true);
        });
    });
</script>

将信息发送到服务器

另外,在我的情况下,我必须以不同于默认html格式的方式将信息发送到服务器,所以我稍微更改了输入。

<input class="checkgroup2" type="checkbox" data-bind="checked:IsSelected" />
<input type="hidden" data-bind="attr:{name: Name },value:IsSelected" />