如何将数组渲染为单选按钮列表?

时间:2012-01-19 03:04:05

标签: arrays foreach knockout.js radio checked

我想循环遍历我在Javascript中定义的数组并呈现单选按钮列表。我的代码目前无法正常工作,如下所示(也在jsfiddle上):

<div data-bind="foreach: options" >
    <div>
        <input type="radio" name="optionsGroup" data-bind="checked: selected" />
        <span data-bind="text: label"></span>
     </div>    
</div>
var optionsList = [
    {"value": "a","label": "apple"},
    {"value": "b","label": "banana"},
    {"value": "c","label": "carrot"}
];
function viewModel() {
    var self = this;
    self.options = optionsList;
    self.selected = ko.observable("a");
    self.selected.subscribe(function(newValue) {
        alert("new value is " + newValue);
    });
}
ko.applyBindings(new viewModel());

如果我的数组是html的一部分,那么它工作正常,请看这个(或jsfiddle):

<div>
    <input type="radio" name="optionsGroup" value="a" data-bind="checked: selected"     />Apple
</div>
<div>
    <input type="radio" name="optionsGroup" value="b" data-bind="checked: selected" />Banana
</div>
<div>
     <input type="radio" name="optionsGroup" value="c" data-bind="checked: selected" />Carrot
</div>
<div data-bind="text: selected">
</div>
function viewModel() {
    var self = this;
    self.selected = ko.observable("a");
    self.selected.subscribe(function(newValue) {
        alert("new value is " + newValue);
    });
}    
ko.applyBindings(new viewModel());

我通过在我的javascript中生成所有html并使用复选框来完成此工作,但是使用foreach迭代器生成了一组radiobuttons。

有没有人得到像我第一个工作的例子?

4 个答案:

答案 0 :(得分:16)

这是一种方法。请注意,attr绑定应该在checked绑定之前。

var optionsList = [
    {"value": "a", "label": "apple"},
    {"value": "b", "label": "banana"},
    {"value": "c", "label": "carrot"}
];

function viewModel() {
    this.options = optionsList;
    this.selected = ko.observable("a");
}

ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<h3>Fruits</h3>
<div data-bind="foreach: options" >
  <label>
    <input type="radio"
           name="optionsGroup" 
           data-bind="attr: {value: value}, checked: $root.selected" />
    <span data-bind="text: label"></span>
  </label>    
</div>

<h3>Selected value:</h3>
<pre data-bind="text: ko.toJSON($root.selected)"></pre>

答案 1 :(得分:1)

您的代码出现此错误:

  

消息:ReferenceError:未定义selected;

     

绑定值:已选中:已选中

您在视图模型级别定义了selected,但是您在foreach内引用它,因此Knockout.js正在选项级别上查找它。

变化:

<div><input type="radio" name="optionsGroup" data-bind="checked: selected" />

为:

<div><input type="radio" name="optionsGroup" data-bind="checked: $root.selected" />

$root.selected将在视图模型级别上查找selected属性。

HERE 是修改后的代码。

有关伪变量的更多信息(如$root),请参阅3. Access to parent binding contexts

答案 2 :(得分:1)

为了能够拥有整个对象,最好使用checkedValue而不是attr:{value},如下所示:

Fruits
<div data-bind="foreach: options" >
    <div><input type="radio" name="optionsGroup" data-bind="checkedValue: $data, checked: $root.selected" />
    <span data-bind="text: label"></span></div>    
</div>

答案 3 :(得分:0)

你的代码是有效的。只需在你的jsfiddle中包含knockout.js并设置文档“onDomready”:http://screencast.com/t/DmTSgCoEUsxC