【问题标题】:Knockout checkbox enable dependencies剔除复选框启用依赖项
【发布时间】:2012-11-11 21:42:42
【问题描述】:

我正在尝试使用依赖项启用复选框。
如果两个输入字段中的一些不为空,我想启用一个复选框。
这是我的 javascript 代码:

var GoogleContactsViewModel = function() {
        var _self = this;
        _self.GoogleContacts = ko.observable();
        _self.IsEnabled = function (item) {
            console.log(item);
            return item.GivenName.length || item.FamilyName.length;
        };
        _self.GetData = function() {
            $.ajax({
                url: "some url",
                method: "POST",
                success:function (dataFromServer) {
                    _self.GoogleContacts(dataFromServer);
                }
            });
        };
        _self.GetData();
    };
    ko.applyBindings(new GoogleContactsViewModel());

这里是html:

<table class="importContacts" data-bind="with: GoogleContacts">
    <thead>
        <tr>
            <th></th>
            <th>@CommonResource.LastNameColumn</th>
            <th>@CommonResource.NameColumn</th>
            <th>E-mail</th>
            <th>@CommonResource.MyEmployee</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: contacts">
        <tr>
            <td>
                <input type="checkbox" name="isImport" data-bind="value: FullName, enable: $root.IsEnabled($data)" />
            </td>
            <td>
                <input type="text" name="FamilyName" data-bind="value: FamilyName, valueUpdate: 'afterkeydown'" placeholder="@ContactResource.EnterLastName" />
            </td>
            <td>
                <input type="text" name="GivenName" data-bind="value: GivenName, valueUpdate: 'afterkeydown'" placeholder="@ContactResource.EnterName" />
            </td>
            <td>
                <span data-bind="text: Email"></span>
            </td>
            <td>
                <input type="checkbox" name="MyEmployee" value="" />
            </td>
        </tr>    
    </tbody>


</table>

它非常适合初始化..here is printscreen。但它不适用于更改,我的意思是在您填写任何空白字段后它不会启用。

【问题讨论】:

  • 你说的变化是什么?当您从服务器或文本框中检索新数据时?您的文本框未绑定到可观察的属性,因此您不能指望敲除检测到它们的更改。
  • 我说的是输入字段中的更改数据。当用户给它写东西时——我尊重 KO 重新计算函数 IsEnabled

标签: javascript knockout.js


【解决方案1】:

你需要使用 ko.observables。您映射数据的方式是单向绑定。这意味着无法进行更新。

如果你看下面的函数,它增加了两个项目。首先,使用 ko.mapping 将你接收到的数据变成 ko.observables。其次,将计算函数添加到接收到的每一行数据中。

_self.GetData = function () {
    $.ajax({
        url: "some url",
        dataType: 'json',
        method: "POST",
        success: function (dataFromServer) {
        var localData = ko.mapping.fromJS(JSON.parse(contacts));
        var observArray = localData.contacts();
        for (var i = 0; i < observArray .length; i++) {
            observArray [i].IsEnabled = ko.computed({
              read: function () {
                console.log(this.GivenName());
                return this.GivenName().length || 
                    this.FamilyName().length;
            },
            owner: observArray [i]
           });
          }

            _self.GoogleContacts(localData);
            ko.applyBindings(_self);
        },
        error: function (result) {}
    });
};

另外,将 ko 启用绑定添加到您的复选框。

       <td>
            <input type="checkbox" name="MyEmployee" value="" 
                   data-bind="enable: IsEnabled " />
        </td>

编辑 - 更新 GetData 以使用下面的供应 JSFIDDLE

【讨论】:

  • 它不是映射((我做错了什么?这是我的数据屏幕(console.log(result))。console.log(localData) 告诉我Object {__ko_mapping__: Object} __ko_mapping__: Object contacts: Object[0] __proto__: Object
  • 你能做一个简化的jsfiddle吗?如果有问题,请使用 ascii 字符串而不是 ajax。
  • 更新于jsfiddle.net/photo_tom/Fsk99/6。最大的问题是两次调用 ko.applybindings。我已经修改了答案以显示结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2013-07-18
  • 1970-01-01
  • 2014-08-17
相关资源
最近更新 更多