2016-02-12 3 views
1

Я пишу элемент, который рекурсивно строит дерево меню из объекта JSON. Однако, когда функция вызывает саму себя, я получаю ошибку: this.buildMenu is not a functionRecursive Function Call Polymer

Вот buildMenu

buildMenu: function(items) { 
var node = new Array(); 

items.forEach(function(elem,index,arr) { 
    node.push(elem.Name); 

    if (elem.SubBranch.length > 0) { 
     return this.buildMenu(elem.SubBranch); //error is here 
    } 
}); 

return node; 
} 

оригинальный метод, который вызывает buildMenu

handleRes: function() { 
    this.response = this.$.categoryList.lastResponse; 
    this.menuItems = this.buildMenu(this.response); 
    //... 
} 

Я проверил, что данные там и правильно отформатирован , Если я прокомментирую рекурсивный вызов, я получаю первый уровень результатов. Таким образом, он работает в этом отношении.

Аргумент elem.SubBranch, который вызывается в рекурсивном вызове, является массивом и полностью действителен, если это имеет значение.

+0

Можете ли вы построить плункер, чтобы продемонстрировать проблему? –

ответ

7

Проблема заключается в том, что внутри функции обратного вызова forEach, это относится к контексту самой функции обратного вызова. Затем, когда вызывается this.buildMenu, он терпит неудачу, потому что функция не определена в этом контексте.

Функция forEach принимает аргумент для предоставления объекта, который вы хотите использовать, когда используется ключевое слово. В этом случае вы можете использовать следующий код:

buildMenu: function(items) { 
var node = new Array(); 

items.forEach(function(elem,index,arr) { 
    node.push(elem.Name); 

    if (elem.SubBranch.length > 0) { 
     return this.buildMenu(elem.SubBranch); //error is here 
    } 
}, this); 

return node; 
} 

Обратите внимание на параметр это при условии, после обратного вызова.