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