knockout.js - 在 foreach 中使用 if 绑定(bind)(KnockoutJS)

标签 knockout.js

我已经发布了我的 question去knockoutJS论坛。但我不确定我是否会在今晚之前得到帮助。所以我发布了同样的问题:这有点紧急;我在等你的建议:

风景:

<select data-bind="foreach: groups"> 
    <!-- ko if: false --> 
    <optgroup data-bind="attr: {label: label}, foreach: children"> 
        <option data-bind="text: label"></option> 
    </optgroup> 
    <!-- /ko --> 
    <!-- ko ifnot: false --> 
    <option data-bind="text: label"></option> 
    <!-- /ko --> 
</select>

JS:
function Group(label, children) { 
    this.label = ko.observable(label); 
    this.children = ko.observableArray(children); 
} 

function Option(label) { 
    this.label = ko.observable(label); 
} 

var viewModel = { 
    groups: ko.observableArray([ 
        new Group("Option All", null), 
        new Group("Group 1", [ 
            new Option("Option 1"), 
            new Option("Option 2"), 
            new Option("Option 3") 
            ]), 
        new Group("Group 2", [ 
            new Option("Option 4"), 
            new Option("Option 5"), 
            new Option("Option 6") 
            ]), 
        new Group("Group 3", [ 
            new Option("Option 7"), 
            new Option("Option 8"), 
            new Option("Option 9") 
            ]) 
    ]) 

}; 


ko.applyBindings(viewModel); 

结果:
<select> 
    <optGroup>Option All</optGroup> 
    <option>Option All</option> 
    <optGroup label="Group 1"> 
        <option>Option 1</option> 
        <option>Option 2</option> 
        <option>Option 3</option> 
    </optGroup> 
    <option>Group 1</option> 
    <optGroup label="Group 2"> 
        <option>Option 4</option> 
        <option>Option 5</option> 
        <option>Option 6</option> 
    </optGroup> 
    <option>Group 2</option> 
    <optGroup label="Group 3"> 
        <option>Option 7</option> 
        <option>Option 8</option> 
        <option>Option 9</option> 
    </optGroup> 
    <option>Group 3</option> 
</select>

预期结果:
<select> 
    <option>Option All</option> 
    <optGroup label="Group 1"> 
        <option>Option 1</option> 
        <option>Option 2</option> 
        <option>Option 3</option> 
    </optGroup> 
    <optGroup label="Group 2"> 
        <option>Option 4</option> 
        <option>Option 5</option> 
        <option>Option 6</option> 
    </optGroup> 
    <optGroup label="Group 3"> 
        <option>Option 7</option> 
        <option>Option 8</option> 
        <option>Option 9</option> 
    </optGroup> 
</select>

因此,考虑到“结果”和“预期结果”之间的区别
我究竟做错了什么?即使我给“if”绑定(bind)提供静态值,比如
<!-- ko if: false -->” 具有约束力。

最佳答案

混合版本:选项和组
只有 Group 有属性 children,如果有属性 - group,如果没有,则 Option

<select data-bind="foreach: groups">
<!-- ko if: $data.hasOwnProperty('children') -->
<optgroup data-bind="attr: {label: label}, foreach: children">
    <option data-bind="text: label"></option>
</optgroup>
<!-- /ko -->
<!-- ko ifnot: $data.hasOwnProperty('children')  -->
<option data-bind="text: label"></option>
<!-- /ko --></select>

function Group(label, children) {
this.label = ko.observable(label);
this.children = ko.observableArray(children);}


function Option(label) {
this.label = ko.observable(label);}


var viewModel = {
groups: ko.observableArray([
    new Option("Option All"),
    new Group("Option All", [{"label": "Option without object"}]),
    {"label":"OptionGroup Test", "children":[{"label":"label_1"},{"label":"lebel_2"}]},
    new Group("Group 1", [
        new Option("Option 1"),
        new Option("Option 2"),
        new Option("Option 3")
        ]),
    new Option("Option only"),
    new Group("Group 2", [
        new Option("Option 4"),
        new Option("Option 5"),
        new Option("Option 6")
        ]),
    new Group("Group 3", [
        new Option("Option 7"),
        new Option("Option 8"),
        new Option("Option 9")
        ])
])};
ko.applyBindings(viewModel); 

关于knockout.js - 在 foreach 中使用 if 绑定(bind)(KnockoutJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903966/

相关文章:

javascript - Knockout JS对象原型(prototype)问题

jquery - 使用 knockout.js 从表单中获取或发送数据

javascript - knockout .js : ObservableArray with ObservableArrays inside?

javascript - AngularJs:当第 3 方库更改 DOM 时得到通知( knockout )

使用 knockout.js 和 Web Api 进行本地化

knockout.js - 挖空渲染 html 字符串

javascript - 我应该在哪里存储每个用户的 UI 配置

javascript - 为什么 Phrogz 多列排序在我的情况下不起作用

jquery - knockout v.3 : Subscribing to an observable at a global level containing an object

knockout.js - 模板内的 knockout 绑定(bind)不起作用