Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 淘汰树-获取树中的所有选定项_Arrays_Knockout.js - Fatal编程技术网

Arrays 淘汰树-获取树中的所有选定项

Arrays 淘汰树-获取树中的所有选定项,arrays,knockout.js,Arrays,Knockout.js,我有一个树状结构的客户端,我绑定到一个无序列表,每个客户端可能有也可能没有子客户端。我已经添加了在列表中选择项目的功能,但是现在我不知道如何在树中循环并获得所有选定项目的数组 特别是,这头野兽是我遇到问题的地方: cp.GetSelectedClientsArray = function (clients) { var selected = []; ko.utils.arrayForEach(clients, function (item) { if (item.

我有一个树状结构的客户端,我绑定到一个无序列表,每个客户端可能有也可能没有子客户端。我已经添加了在列表中选择项目的功能,但是现在我不知道如何在树中循环并获得所有选定项目的数组

特别是,这头野兽是我遇到问题的地方:

cp.GetSelectedClientsArray = function (clients) {
    var selected = [];
    ko.utils.arrayForEach(clients, function (item) {
        if (item.IsSelected()) {
            selected.push(item.ClientName());
        }
        ko.utils.arrayForEach(item.SubClient(), function (subItem) {
            if (subItem.IsSelected()) {
                selected.push(subItem.ClientName());
            }
            cp.GetSelectedClientsArray(subItem);
        });
    });
    console.log(selected);
    return selected;
};
在切换IsSelected()observable之后,我想在列表中循环,得到一个只包含选定项的数组

这篇文章我已经写了好几次了,我真的需要一些帮助。我甚至不知道如何编写一个可以工作的递归函数,因为每次我从内部调用该函数时,它都会清除我的“selected”数组,并将其设置为全局变量,从而保留数组中曾经选择过的任何项


感谢您的帮助

必须将选定的子项添加到父项选择中

ko.utils.arrayForEach(item.SubClient(), function (subItem) {
   if (subItem.IsSelected()) {
      selected.push(subItem.ClientName());
   }       
   //cp.GetSelectedClientsArray(subItem);
   selected.push.apply(selected, cp.GetSelectedClientsArray(subItem));
});


我希望这会有所帮助。

必须将选定的子项添加到父项选择中

ko.utils.arrayForEach(item.SubClient(), function (subItem) {
   if (subItem.IsSelected()) {
      selected.push(subItem.ClientName());
   }       
   //cp.GetSelectedClientsArray(subItem);
   selected.push.apply(selected, cp.GetSelectedClientsArray(subItem));
});


我希望它能有所帮助。

当您只需在视图模型上创建一个
SelectedClients
字段,并在切换时将其删除/添加到该字段中时,为什么要递归地在客户机列表上行走

例如:

_self.SelectedClients = ko.observableArray([]);

_self.ToggleSelectedUser = function (data, event) {
    var toggle = !data.IsSelected();
    data.IsSelected(toggle);

    if (toggle)
        _self.SelectedClients.push(data.ClientName());
    else
        _self.SelectedClients.remove(data.ClientName());
};

更新:

根据您的评论,当您确实需要在树上递归行走时,您可以尝试以下方法:

function AggregateSelectedClients(clients, results)
{
    results = results || [];
    if (!clients || !clients.length) return results;

    ko.unwrap(clients).forEach(function(v, i)
                    {
                    var selected = ko.unwrap(v.IsSelected);
                    var subClients = ko.unwrap(v.SubClient);

                    if (selected)
                        results.push(ko.unwrap(v.ClientName));

                    if (subClients && subClients.length)
                        AggregateSelectedClients(subClients, results);
                    });

    return results;
}

当您只需在视图模型上创建一个
SelectedClients
字段,并在切换时将其删除/添加到该字段中时,为什么要递归地遍历客户机列表

例如:

_self.SelectedClients = ko.observableArray([]);

_self.ToggleSelectedUser = function (data, event) {
    var toggle = !data.IsSelected();
    data.IsSelected(toggle);

    if (toggle)
        _self.SelectedClients.push(data.ClientName());
    else
        _self.SelectedClients.remove(data.ClientName());
};

更新:

根据您的评论,当您确实需要在树上递归行走时,您可以尝试以下方法:

function AggregateSelectedClients(clients, results)
{
    results = results || [];
    if (!clients || !clients.length) return results;

    ko.unwrap(clients).forEach(function(v, i)
                    {
                    var selected = ko.unwrap(v.IsSelected);
                    var subClients = ko.unwrap(v.SubClient);

                    if (selected)
                        results.push(ko.unwrap(v.ClientName));

                    if (subClients && subClients.length)
                        AggregateSelectedClients(subClients, results);
                    });

    return results;
}

如果我正确地理解了你想要做的事情,为什么不试试这样的事情呢

 _self.SelectedClient = ko.observableArray();
 _self.ToggleSelectedUser = function (data, event) {
        var toggle = !data.IsSelected();
        data.IsSelected(toggle);

        if(toggle === true) 
        { 
             _self.SelectedClient.push(data.ClientName()); 
        } 
        else 
        {
           _self.SelectedClient.remove(data.ClientName());
        }

如果我正确地理解了你想要做的事情,为什么不试试这样的事情呢

 _self.SelectedClient = ko.observableArray();
 _self.ToggleSelectedUser = function (data, event) {
        var toggle = !data.IsSelected();
        data.IsSelected(toggle);

        if(toggle === true) 
        { 
             _self.SelectedClient.push(data.ClientName()); 
        } 
        else 
        {
           _self.SelectedClient.remove(data.ClientName());
        }

这是递归版本

cp.GetSelectedClientsArray = function (clients) {
    var result = [];
    function GetSelected(clients){
        for (var i in clients){
            if(clients[i].IsSelected()){
                result.push(clients[i].ClientName());
            }
            GetSelected(clients[i].SubClient());
        }
    }
    GetSelected(clients);
    console.log(result);
    return result;
};

请参见这里的递归版本

cp.GetSelectedClientsArray = function (clients) {
    var result = [];
    function GetSelected(clients){
        for (var i in clients){
            if(clients[i].IsSelected()){
                result.push(clients[i].ClientName());
            }
            GetSelected(clients[i].SubClient());
        }
    }
    GetSelected(clients);
    console.log(result);
    return result;
};

请参见

是否有理由在选择_self.ToggleSelectedUser函数时不将所选客户端添加/删除到可观察阵列?是否有理由在选择_self.ToggleSelectedUser函数时不将所选客户端添加/删除到可观察阵列?这解决了问题好的,谢谢。我知道在某个时刻,我将不得不迭代树中的每个项。有没有想过如何使用递归函数来实现这一点?这非常有用,但@GSerjo的答案正是我想要的。谢谢这解决了描述的问题,谢谢。我知道在某个时刻,我将不得不迭代树中的每个项。有没有想过如何使用递归函数来实现这一点?这非常有用,但@GSerjo的答案正是我想要的。谢谢这正是我想要的。谢谢这正是我想要的。谢谢