【问题标题】:Knockout array subscription not working淘汰赛阵列订阅不起作用
【发布时间】:2013-11-11 16:25:29
【问题描述】:

几天来,我一直在尝试让 Knockout 每次在人员行列表上的“邮政编码”值发生变化时引发一个事件。我尝试了各种方法来实现这种行为,但似乎无法做到正确。目前,这是我拥有的 Html:-

<table>
    <thead>
        <tr>
            <th>First name</th>
            <th>Last Name</th>
            <th>Age</th>
            <th>Zip Code</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: people">
        <tr>
            <td data-bind="text: firstName"></td>
            <td data-bind="text: lastName"></td>
            <td data-bind="text: age"></td>
            <td ><input id="zipCodInput" data-bind="value: zipCode" /></td>
        </tr>
    </tbody>
</table>
</body>

这是我用来填充表格的脚本:-

<script>
    jQuery(document).ready(function () {

        // Ultimately will come from an Ajax call
        //var result = $.ajax({
        //    type: "GET",
        //    url: "/api/Resource",
        //    async: false
        //}).responseText;

        // Hard coded array for testing
        var result = [{ "firstName": "Jimmy", "lastName": "Smith", "age": "43", "zipCode": "" },
        { "firstName": "John", "lastName": "Jones", "age": "23", "zipCode": "" },
        { "firstName": "Sarah", "lastName": "Palmer", "age": "26", "zipCode": "GH7HU" },
        { "firstName": "Fred", "lastName": "Smith", "age": "34", "zipCode": "" },
        { "firstName": "Simon", "lastName": "Davis", "age": "53", "zipCode": "" }];

        function viewModel() {
            var myArray = ko.observableArray(result);

            myArray.subscribe(function (changes) {
                console.log(changes);
            }, null, "arrayChange");

            people = myArray;
        };

        ko.applyBindings(new viewModel());
    });
</script>

它正确绑定了数据,但在编辑页面上的邮政编码行时,我从未记录任何更改。知道如何修改或重写代码以捕获这些更改吗?

最终,我只想将更改的行添加到 json 数组中以回发服务器端。

谢谢。

【问题讨论】:

    标签: knockout.js knockout-2.0 knockout-mapping-plugin


    【解决方案1】:

    默认情况下,您不会在 observableArray 级别收到通知。 observableArray 之所以只关注其目录中的项目,而不是这些项目的属性是否发生变化。

    如果你想观察变化,你可以这样做 -

    var myArray = ko.observableArray(result);
    ko.utils.arrayForEach(myArray(), function (thisItem) {
        thisItem.subscribe(function (changes) {
            console.log(changes);
        });
    });
    
    people = myArray;
    

    这将订阅 observableArray 中的每个单独的对象,并在该对象的属性更改时触发。

    【讨论】:

      【解决方案2】:

      如果数组本身发生变化,这将起作用,但要跟踪数组内对象的变化,您应该有一个可观察的数组...

      Knockout 网站上的这个示例应该对您有所帮助:
      http://knockoutjs.com/examples/contactsEditor.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2016-02-29
        • 2014-05-10
        • 2015-01-04
        • 2012-10-09
        • 2015-03-27
        • 1970-01-01
        相关资源
        最近更新 更多