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,并尝试使用第二个按钮添加新项目