Javascript 如何在绑定中使用switch语句?

Javascript 如何在绑定中使用switch语句?,javascript,knockout.js,Javascript,Knockout.js,我有一个ViewModel,看起来像: { empName: [ { name: 'NAME1' }, { name: 'NAME2' } ] } 我想根据我的empName显示不同的部门名称,同时使用switch语句在name属性中循环。 使输出为: 第一部门 第二部门 我尝试了以下方法: <ul data-bind="foreach: empName"> <div data-bind="swi

我有一个ViewModel,看起来像:

{
    empName: [
        { name: 'NAME1' },
        { name: 'NAME2' }
    ]        
}
我想根据我的
empName
显示不同的部门名称,同时使用switch语句在
name
属性中循环。 使输出为:

第一部门
第二部门

我尝试了以下方法:

<ul data-bind="foreach: empName">
        <div data-bind="switch: name">
        <div data-bind="case: 'Name1'">
            Department 1
        </div>
        <div data-bind="case: 'Name2'">
            Department 2
        </div>

        <div data-bind="case: $default">
        </div>
    </div>
    第一部门 第二部门
但我得到以下输出:

第一部门
第二部门
第一部门
第二部门


如何实现这一点?

没有开关,但您可以在以下情况下使用:

<div data-bind="foreach: empName">
    <div data-bind="if: name == 'Name1'">
        Department 1
    </div>
    <div data-bind="if: name == 'Name2'">
        Department 2
    </div>
</div>

第一部门
第二部门

为什么不重新思考一下这个问题,将这个逻辑转化为一个函数呢?根据经验,我尽量使绑定尽可能简单,并将逻辑放入javascript中

以下是一个完整的示例:

var viewModel = {
   empName: [
        { name: 'NAME1' },
        { name: 'NAME2' }
   ]        
};

viewModel.departmentName = function(name) {
    var departmentName = "Department ";

    switch (name) {
        case "NAME2":
            departmentName += "2";
            break;
        case "NAME1":
        default:
            departmentName += "1";
            break;
    }

    return departmentName; 
}.bind(viewModel);

ko.applyBindings(viewModel);
然后在标记中:

<ul data-bind="foreach: empName">
    <li data-bind="text: viewModel.departmentName(name)"></li>
</ul>

我的两分钱!!Knockout没有switch case语句。按照

Michael Best的开关/箱子装订 ()相当灵活 可以让您轻松处理此问题和更复杂的问题(更多状态 而不是真/假)

否则,您可以将条件绑定用作:

    <!-- ko if: name == 'NAME1' -->
    <div data-bind="if: name == 'NAME1'">Department 1</div>
    <!-- /ko -->

第一部门
而且

第一部门

我想知道KO是否有开关箱投标。。。看看图书馆吧。希望这有帮助。借用的示例是将开关盒放在JS中。然后对HTML中的字符串数组执行foreach。@CrimsonChris完全同意。将更冗长/复杂的逻辑排除在绑定之外。我在回答中建议这样做。谢谢。这很有帮助,但它会创建两个额外的空div。输出如下n部门1部门2
    <!-- ko if: name == 'NAME1' -->
    <div data-bind="if: name == 'NAME1'">Department 1</div>
    <!-- /ko -->
<div data-bind="if: name == 'NAME1'">Department 1</div>