2016-07-05 3 views
1

Я получаю эту ошибку и не знаю, как решить этоUncaught RangeError: превышен максимальный размер стека вызовов. jstree

Uncaught RangeError: Maximum call stack size exceeded

Я пытаюсь построить дерево с использованием jstree Lib. Данные поступают из двух разных HTTP-вызовов. Я получаю свои исходные данные, как это:

  $scope.treeFolders = []; 
     $scope.treeFilters = []; 
     $scope.tree = []; 
    var folders = function() { 
     $http.get("folders.json") 
     .success(function (res) { 
        angular.forEach(res, function(parent){ 
         // console.log(parent) 
         if(!("parent" in parent)){ 
          parent.parent = "#" 
         } 
        }) 

        $scope.treeFolders = res 
        console.log($scope.treeFolders) 
       }); 
     }; 
     folders(); 

    var filters = function(){ 
      $http.get("child.json") 
       .success(function (res) { 
        angular.forEach(res, function(obj){ 
         if(!("parent" in obj)){ 
          // console.log(obj.folderId) 
          obj.parent = obj.folderId; 
         } 
         // console.log(obj) 
        }); 

        $scope.treeFilters = res; 
        console.log($scope.treeFilters) 

       }); 
    }; 
    filters(); 

console.log возвращает массив, потому что теперь все хорошо. Затем я использую функцию нагрузки, чтобы объединить два массива в один массив супер

$scope.load = function(){ 
    // method 1 
      $scope.tree = $scope.treeFolders.concat($scope.treeFilters); 
      console.log(JSON.stringify($scope.tree)) 
    // method 2  
     // $scope.treeFolders.forEach(function(item){ 
     // $scope.tree.push(item) 
     // }) 
     // $scope.treeFilters.forEach(function(item){ 
     // $scope.tree.push(item) 
     // }) 
     // console.log(JSON.stringify($scope.tree)) 
     } 

Так как вы можете видеть, я пытался получить один массив при помощи двух методов, как работать, так и я получаю этот массив

[{ 
"id":1, 
"userId":1, 
"createdDt":"2016-06-27T13:05:03.000+0000", 
"text":"folder", 
"parent":"#" 
    },{ 
"id":2, 
"parent":1, 
"userId":1, 
"createdDt":"2016-06-27T13:26:45.000+0000", 
"text":"child folder" 
    },{ 
"id":2, 
"folderId":2, 
"folder":{"id":2,"text":"child folder"}, 
"body":"empty", 
"user":{"id":1,"name":"User 1"}, 
"userId":1, 
"createdDt":"2016-06-27T13:05:47.000+0000", 
"text":"filter 1", 
"parent":2 
    },{ 
"id":3, 
"folderId":2, 
"folder":{"id":2,"text":"child folder"}, 
"body":"nothing", 
"user":{"id":1,"name":"User 1"}, 
"userId":1,"createdDt":"2016-06-27T13:00:00.000+0000", 
"text":"filter 4", 
"parent":2 
    }] 

следует из логики jstree документы, мое дерево должно выглядеть

* Folder (root) 
---- * Child Folder (parent) 
    ---- * Filter 1 (Child) 
    ---- * Filter 4 (Child) 

, но вместо этого я получаю ошибку, что-то слишком много итераций. Может ли кто-нибудь помочь мне найти мою ошибку? Заранее спасибо. Plunker прилагается

ответ

3

В вашем массиве есть два элемента с «id»: 2, а один из них имеет родительский элемент, который также определен как «id»: 2. Вероятно, это создает круговую ссылку.

Попробуйте изменить идентификатор вашего первого дочернего элемента на 4, я сделал это на вашей ссылке plunker и на дереве, загруженном, как вы искали.

+0

oh У меня возникла эта проблема, спасибо за объяснение ... но если я ее изменю, она разрушит структуру БД. Например, у меня есть фильтр с идентификатором 5, также у меня есть папка с идентификатором 5, я изменил идентификатор фильтра, например, на 6, затем я хочу удалить этот фильтр. Я отправляю запрос API для удаления этого фильтра. НО API видит, что идентификатор фильтра равен 6 и удаляет неправильный фильтр, как быть с этим? – antonyboom

+0

Я не совсем уверен, что я следую, но похоже, что это другая проблема с API или вашим источником данных. Для jsTree, если вы определяете родительский атрибут на каждом узле, он должен иметь уникальные идентификаторы для каждого элемента, и нужно избегать циклических ссылок для отношений родитель-потомок. – Adam

+0

Помогло бы оно указать атрибуты для каждого элемента, который будет использоваться для ваших фильтров? Проверьте «li_attr» и «a_attr» на [исходные данные JSON] (https://www.jstree.com/docs/json/) – Adam

Смежные вопросы