Knockout.js 刷新可观察数组中的选定项 删除

Knockout.js 刷新可观察数组中的选定项 删除,knockout.js,Knockout.js,我问了,但用了更好的方式,得到了我需要的答案 您的viewModel.people数组只是一个常规JavaScript数组,而不是ko.observearray。在viewModel.refresh方法中,您将用另一个值替换它。UI将不知道它已被更新 相反,请定义您的viewModel.people属性,如下所示: people: ko.observableArray(ko.utils.arrayMap(model.people, function (person) { return n

我问了,但用了更好的方式,得到了我需要的答案


您的
viewModel.people
数组只是一个常规JavaScript数组,而不是
ko.observearray
。在
viewModel.refresh
方法中,您将用另一个值替换它。UI将不知道它已被更新

相反,请定义您的
viewModel.people
属性,如下所示:

people: ko.observableArray(ko.utils.arrayMap(model.people, function (person) {
    return new Person(person);
}))
viewModel.refresh
方法中,将其用作更改值的函数:

viewModel.people(ko.utils.arrayMap(model.people, function (person) {
    return new Person(person);
}));
您的方法还有一个问题(至少在JSFIDLE代码中)。您正在订阅
selectedPerson
属性更改并调用
viewModel.refresh
。每次更改
selectedPerson
时,它都会触发
刷新
,这将替换您的
视图模型中的所有人员。人员
数组,从而再次触发
selectedPerson
更改。基本上,这里有一个无限循环


更好的选择是只在现有列表的末尾添加新的人员,或者在您的情况下,只更新每个人员的编号。顺便说一句,
Person.numbers
在这种情况下也应该是一个
observearray

refresh
中,您正在重新创建人员集合,但您的
selectedPerson
从未更改,因此它指向最初选择的人员,这就是为什么您在UI上看不到更改的原因。与其在刷新中重新创建或更新您的viewmodel:@nemesv,我想我把问题简化了!我需要每隔一段时间重新创建模型(从web方法获取返回的JSON),因此在我的应用程序之外所做的更改(即直接到数据)将需要反映在UI中。对缺少的
observearray
(不幸的是没有修复它)有很好的理解,但已经更新了我的问题并对此进行了修改。我知道无限循环的事情,但这只是一个单独的测试块来代表一个特定的问题,所以我不担心。@PaulAldred Bann我不是100%确定你想要完成什么。这把小提琴现在似乎起作用了。当modal重新打开时,将显示新的编号。如果您希望open modal在数字更改时刷新数字,那么您需要额外努力更新现有的人员数组和他们的person.numbers数组,并避免每次重新创建它们。这正是我想要的,以便在添加新添加的项目时更新显示新添加项目的模式UI(但不是推送,而是从JSON中返回的项重新创建的实际可观察数组)。