knockout.js 更新源阵列后,Knockout下拉列表未更新

qjp7pelc  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(158)

我有一个从视图模型的可观察数组中填充的下拉列表。有一个数据绑定到一个函数的按钮,该函数从数组中删除一个元素。当单击该按钮时,数组将进行移位以删除一个元素。但是,下拉列表并不反映该更改,下拉列表的值也不会更改。
HTML格式:

<!-- ko if: t -->
<select data-bind="template: { name: 'selectTemplateType', data: t }, value: selectedId"></select>
<!-- /ko -->
<!-- ko ifnot: t -->
<select>
    <option>No templates loaded</option>
</select>
<!-- /ko -->
<div data-bind='text: selectedId'></div>

<script type="text/html" id="selectTemplateType">
    <!-- ko foreach: groups -->
        <optgroup data-bind="attr: { 'label': name }, foreach: types">
            <option data-bind="value: id, text: name"></option>
        </optgroup>
    <!-- /ko -->
</script>

<div>
<button type="button" data-bind="click: remove">Remove First</button>
</div>

浏览器:

var t = {
    groups: [
        { name: 'a', types: [{id: 1, name: 't1'}] },
        { name: 'b', types: [{id: 102, name: 't2'}, {id: 103, name: 't3'}] },
        { name: 'c', types: [{id: 5, name: 'x'}] }
    ]
}
var ViewModel = function() {
    var me = this;
    let temp = {
      groups: [
          { name: 'a', types: [{id: 1, name: 't1'}] },
          { name: 'b', types: [{id: 102, name: 't2'}, {id: 103, name: 't3'}] },
          { name: 'c', types: [{id: 5, name: 'x'}] }
      ]
      };
    me.t= ko.observable(ko.mapping.fromJS(temp));
    me.selectedId= ko.observable(103);

    me.remove = function(){
        me.t().groups().shift();
    }
};
var vm = new ViewModel();
ko.applyBindings(vm);

你可以在这里看到混乱的行动:http://jsfiddle.net/Eves/2kw9y37t/24/
我想我错过了一些愚蠢的事情。有人知道我错过了什么吗?

emeijp43

emeijp431#

如果您查看Observable Arrays中的文档,您会看到以下内容:
弹出,推入,移位,取消移位,反转,排序,拼接
所有这些函数都等效于在底层数组上运行本地JavaScript数组函数,然后将更改通知侦听器
当您执行以下操作时:

me.t().groups()

在基础数组上进行操作,然后:

me.t().groups().shift();

它工作正常,但是您不通知侦听器有关更改,并且html中没有任何更改。
你可以这样写:

me.t().groups.shift();

也就是调用可观察数组中Knockout提供的shift()方法,请注意groups没有括号。

相关问题