添加项目以淘汰视图模型,不更新视图

Posted

技术标签:

【中文标题】添加项目以淘汰视图模型,不更新视图【英文标题】:Adding item to knock out view model , is not updating the view 【发布时间】:2019-02-05 03:18:13 【问题描述】:

我有一个要绑定到查看列表项的 ViewModel。

var MyViewModel = function() 
    var self = this;

    self.addItems = function(vm) 
        vm.inventoryItems.push('New Item');
    
;

var myVM= new MyViewModel();
ko.applyBindings(myVM);

视图模型有一个名为inventoryItems 的属性(来自服务)。

我同意使用 ,

<ul data-bind="foreach:inventoryItems">
    <li>
        <input class="form-control" type="text" data-bind="value: $data" />
    </li>
</ul>
<div class="text-right">
    <a data-bind="click: $parent.addItems">+ Add more</a>
</div>

现在,集合中已经存在的项目 inventoryItems 正在渲染良好。

当我使用添加新项目时,我可以通过控制台看到正在添加的项目,但视图没有更新!

self.addItems = function(vm) 
            vm.inventoryItems.push('New Item');
        

【问题讨论】:

vm.inventoryItemsko.observableArray 吗? @JonathanTwite,我只是从服务中获取该数组。所以我想,它是不可观察的。我如何使它可观察? “服务”是另一个视图模型吗?还是检索数据的普通对象?如果您想在inventoryItems 中显示项目,它们应该是您的 ViewModel 上的一个参数。 ViewModel 是您希望在屏幕上显示的数据和逻辑 【参考方案1】:

下面的代码 sn-p 将使您的 inventoryItems 可观察

    var MyViewModel = function () 
    var self = this;

    self.inventoryItems = ko.observableArray();

    self.addItems = function (vm) 
        vm.inventories.push('New Item');
        self.inventoryItems(vm.inventories);
      
  ;
var myVM = new MyViewModel();
ko.applyBindings(myVM);

【讨论】:

以上是关于添加项目以淘汰视图模型,不更新视图的主要内容,如果未能解决你的问题,请参考以下文章

杜兰达尔/淘汰赛。更新其他视图/视图模型

我可以以编程方式触发淘汰视图模型更新吗?

淘汰赛仅更新部分视图模型

ajax发布后淘汰js更新视图模型

ko 视图模型在 js 上更新但未在 html 视图中显示

使用视图控制器淘汰嵌套的可观察对象