Knockout.js 如何在从服务器返回的嵌套列表中使用ko.mapping?knocknot.js
我试图在嵌套元素中动态添加数据,问题是我想将从服务器返回的每个对象转换为可观察数组Knockout.js 如何在从服务器返回的嵌套列表中使用ko.mapping?knocknot.js,knockout.js,Knockout.js,我试图在嵌套元素中动态添加数据,问题是我想将从服务器返回的每个对象转换为可观察数组 function viewModel() { this.projects = ko.observableArray(); this.addMember = function addMember() { var match = ko.utils.arrayFirst(this.projects(), function (item) { // return the
function viewModel() {
this.projects = ko.observableArray();
this.addMember = function addMember() {
var match = ko.utils.arrayFirst(this.projects(), function (item) {
// return the first item in the array just for simulation
return true;
});
if (match) {
var newItem = {
name: 'member 5'
};
match.members.push(newItem);
}
};
}
var vm = new viewModel();
// manually declare observable
vm.projects.push({
name: ko.observable('project a'),
members: ko.observableArray([
{ name: 'member 1' },
{ name: 'member 2' }
])
});
vm.projects.push({
name: ko.observable('project b'),
members: ko.observableArray([
{ name: 'member 3' },
{ name: 'member 4' }
])
});
ko.applyBindings(vm);
这就是我现在得到的:
在本例中,如果不想为members属性创建observablearray,我想使用ko.mapping作为“将所有对象设置为数组的列表”,而不将每个对象创建为observablearray。唯一的解决方案是手动更改project2属性。 由于在project2上调用valueHasMutated函数不起作用,我将通过执行以下操作来强制刷新视图:
this.addMember2 = function addMember() {
var match1 = ko.utils.arrayFirst(this.projects2(), function (item) {
// return the first item in the array just for simulation
return true;
});
if (match1) {
var newItem = {
name: 'member 5'
};
match1.members.push(newItem);
}
// trick
var p2 = this.projects2();
this.projects2([]);
this.projects2(p2);
};
我知道这不是一个合适的解决办法,但我找不到更好的办法
对问题的回答:
projects2属性不包含可观察元素。这意味着,如果嵌套元素(如成员)中的某些内容发生更改,则不会通知ko引擎
为了强制刷新视图,我更改了projects2属性。通过这样做,ko引擎将被通知此属性中的某些内容已更改,并刷新视图
- p2=this.projects2():将ObservalArray()转换为正则数组
- this.projects2([]):这将导致视图刷新
- this.projects2(p2):这会添加我在前一行删除的项目,并导致视图刷新
我希望这能有所帮助。请你解释一下这三行。我修改了帖子以回答你的问题。达米恩,你的技巧很好,但我使用了一些手风琴面板,由于视图新鲜,所有面板都关闭了:(,所以我想我仍然需要使用ko.mapping!:(你能解释一下你到底想做什么吗?我想在nestedlist中添加新项目,使用knockout.js中的ka.mapping,转到我的JSFIDLE,并尝试使用第二个按钮添加新项目