当前位置: 代码迷 >> JavaScript >> 复选框的Knockout.js双向绑定不起作用
  详细解决方案

复选框的Knockout.js双向绑定不起作用

热度:101   发布时间:2023-06-05 11:54:44.0

我是敲门.js的新手,但复选框的双向绑定存在一些麻烦。

我有一个绑定到“公司”列表的表。

<table>
    <thead>
        <tr>
            <th>...</th>
            <th>...</th>
            <th>...</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: companies">
        <tr>                
            <td>...</td>
            <td><input type="checkbox" data-bind="checked:isCompanyForCommunication, click:$root.checkedNewCompanyForCommunication" /></td>
            <td>...</td>
        </tr>
    </tbody>
</table>

但是表中应该只有1个公司的isCompanyForCommunication = true 因此,当另一个复选框被选中时,我必须将所有其他公司设置为isCompanyForCommunication = false 因此,我在viewModel中创建了一个方法来取消选中所有其他公司。

    // Definition of Company
    var Company = function (crmAccountObject, contactId, companyForCommunicationId) {

        this.isCompanyForCommunication = ko.observable(false);
    }

    // Definition of the ViewModel
    var ViewModel = function () {
        var self = this;

        // ...

        // Lists
        this.companies = null; // This observableArray is set somewhere else

        // Events
        this.checkedNewCompanyForCommunication = function (company, event) {

            // Set all companies to False
            for (var i = 0; i < self.companies().length; i++) {
                self.companies()[i].isCompanyForCommunication = ko.observable(false);
            }

            // Set the "checked" company to TRUE
            company.isCompanyForCommunication = ko.observable(true);
            return true;
        }
    }

但是,所做的更改不会反映在HTML页面中。 所有其他复选框保持选中状态。

我在jsfiddle中创建了一个简单示例,以显示我想通过复选框确切实现的目标

有人知道我在做什么错吗? 提前致谢!

您不是在设置isCompanyForCommunication的值,而是使用新的isCompanyForCommunication覆盖它。

Observable是函数,要更新它们,您需要使用新值作为参数来调用它们:

this.checkedNewCompanyForCommunication = function (company, event) {

            // Set all companies to False
            for (var i = 0; i < self.companies().length; i++) {
                self.companies()[i].isCompanyForCommunication(false);
            }

            // Set the "checked" company to TRUE
            company.isCompanyForCommunication(true);
            return true;
        }

我还更新了您的示例代码: 。

  相关解决方案