Data binding 如何更新ko.observableArray和rebind中的项目值?

Data binding 如何更新ko.observableArray和rebind中的项目值?,data-binding,knockout.js,ko.observablearray,Data Binding,Knockout.js,Ko.observablearray,我有一个ko.observearray,当页面初始化时,会添加1项。然后,我使用一个和一个data bind=“foreach items”为ko.observearray中的每个项目创建一个div。我在页面上有一个按钮和文本框,当你向输入中添加文本并单击按钮时,一个新的项目会被推到ko.observearray上。这很好,我可以添加一个新的项目与每个按钮点击。ko.observableArray中的项目具有与其关联的价格以及价格变化。我想更新价格,同时仍然能够添加新的项目到ko.array。价

我有一个ko.observearray,当页面初始化时,会添加1项。然后,我使用一个和一个data bind=“foreach items”为ko.observearray中的每个项目创建一个div。我在页面上有一个按钮和文本框,当你向输入中添加文本并单击按钮时,一个新的项目会被推到ko.observearray上。这很好,我可以添加一个新的项目与每个按钮点击。ko.observableArray中的项目具有与其关联的价格以及价格变化。我想更新价格,同时仍然能够添加新的项目到ko.array。价格和商品名称也是可观察的

self.items=ko.observearray(ko.utils.arrayMap)(项,函数(项){
返回{name:ko.observable(item.name),price:ko.observable(item.price)};

如何更新基础项目值(价格)而不重新创建ko.observable数组?是否必须循环遍历ko.observable数组中的每个项目?数据来自JSON调用。顺便说一句,我对Knockout.js不熟悉


这是我尝试的,但我无法使其完全工作。添加一个项目可以正常工作,但如果我有不同数量的项目,则当我更新时..像较少的项目一样,未更新的项目会被销毁。无论如何,围绕这一点?我不想获取没有任何更改的数据。

请执行类似操作

Javascript

var itemObject = function(data){
    var self = this;

    //I recommend using the mapping plugin
    //ko.mapping.fromJS(data, {}, self);

    //If you use the mapping plugin, you don't have to hand bind each property
    this.Id = ko.observable(data.Id);
    .... etc ....
};

var baseViewModel = function(){
    var self = this;

    this.Items = ko.observableArray();

    this.Setup = function(items){
        //using underscore.js to map the items.
        //This turns each item into an "itemObject", which you can 
        //then manipulate and have all changes shown on the screen, even 
        //inside the array.
        self.Items(_.map(items, function(item){
            return new itemObject(item);
        }));
    };
};

$(function(){
  var myApp = new baseViewModel();
  myApp.Setup(items);
  ko.applyBindings(myApp);
});
html



简单方法:不要重新绑定。使用相同的可观察数组。映射插件支持更新现有数组项:查看并注意键/更新映射。(当然,您可以手动执行相同操作,但尽可能避免创建新的可观察数组-这只会让KO脾气暴躁,更难处理。)好的,我看了一下插件映射,有点迷茫,因为我是新手,希望保持简单。我会深入阅读插件。你能在你的问题中创建一个更完整(尽管尽可能短)的例子吗?我们可能会帮助你,即使没有ko映射(尽管这是一个很好的建议),但很难想象您的上下文。此外,如果您还可以将代码发布到一个显示您的场景的提琴中,则更容易提供帮助。使用JS fiddleI将尝试此方法,我会告诉您我的结果。
<div data-bind="foreach: Items">
    <div data-bind="text: Id"></div>
    <!-- other binding things here -->
</div>