将多个输入绑定到可观察数组中的同一变量(Knockout.JS)

Posted

技术标签:

【中文标题】将多个输入绑定到可观察数组中的同一变量(Knockout.JS)【英文标题】:Bind multiple inputs to the same variable in observable array (Knockout.JS) 【发布时间】:2018-09-23 19:56:22 【问题描述】:

我想将多个输入绑定并更改为同一个变量(以便它们始终一起更改为相同的值),但我无法弄清楚这一点。我的代码:

        $(function () 
            var AppVm = function () 
                this.people = ko.observableArray([
                     firstName: 'Bert', lastName: 'Bertington' ,
                     firstName: 'Charles', lastName: 'Charlesforth' ,
                     firstName: 'Denise', lastName: 'Dentiste' 
                ]);
            ;
            vm = new AppVm();
            ko.applyBindings(vm);
        );
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
        <thead>
            <tr><th>First name</th><th>Last name</th></tr>
        </thead>
        <tbody data-bind="foreach: people">
            <tr>
                <td>
                <input type="text" data-bind="textInput: firstName"/>
                </td>
                <td>
                <input type="text" data-bind="textInput: firstName"/>
                </td>
            </tr>
        </tbody>
    </table>

它最初在两个文本输入中加载相同的值,但是当我更改其中一个时,另一个不会更新。如何同时更新它们?

【问题讨论】:

您的属性必须是可观察的,才能通过淘汰赛进行更新。使整个数组可观察并不会使单个属性可观察。 ObservableArrays 只对数组大小的变化做出反应。 我认为是这样的。但是有什么方法可以使整个可观察数组的单个属性可观察? 没有任何内置的方法可以自动执行此操作,但是有一个常用的库可以帮助您,称为 ko.mapping 插件。 knockoutjs.com/documentation/plugins-mapping.html 【参考方案1】:

正如 Jason Spake 在 cmets 中所说:

您的属性必须是可观察的,才能通过淘汰赛进行更新。 使整个数组可观察并不能使个体 可观察的属性。 ObservableArrays 只对 数组大小。

因此,您需要在observableArray 中使用ko.observable() 才能检测到更改:

$(function () 
    var AppVm = function () 
        this.people = ko.observableArray([
             firstName: ko.observable('Bert'), lastName: ko.observable('Bertington') ,
             firstName: ko.observable('Charles'), lastName: ko.observable('Charlesforth') ,
             firstName: ko.observable('Denise'), lastName: ko.observable('Dentiste') 
        ]);
    ;
    vm = new AppVm();
    ko.applyBindings(vm);
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<table>
    <thead>
        <tr><th>First name</th><th>Last name</th></tr>
    </thead>
    <tbody data-bind="foreach: people">
        <tr>
            <td>
                <input type="text" data-bind="textInput: firstName"/>
            </td>
            <td>
                <input type="text" data-bind="textInput: firstName"/>
            </td>
        </tr>
    </tbody>
</table>

现在,当您更改左侧输入中的值时,in 将同时更改右侧输入中的值。

【讨论】:

谢谢,这行得通。我想进一步概括一下,我在第二个答案中的***.com/questions/10048553/… 找到了解决方案(作者:Andy Thomas) @HarshShah 哦,是的,我明白了,这确实使它更容易操作,很好的答案!

以上是关于将多个输入绑定到可观察数组中的同一变量(Knockout.JS)的主要内容,如果未能解决你的问题,请参考以下文章

WPF将单个文本框绑定到集合对象或数组中的元素

knockoutjs 可观察对象绑定的可观察数组

Ionic 4 Angular模板与异步管道绑定到可观察

为啥我的 ListView 数据绑定到可观察集合不能正确显示

绑定到可观察属性,但显示不可观察的子属性

将更改发布到可观察对象的集合