我正试图绕过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()
函数,但是当我选中复选框时似乎没有任何事情发生?
非常感谢任何帮助/提示!
答案 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" />