1 - метод $scope.getChildList вызывается на каждый $digest цикл
2 - каждый вызов $scope.getChildList порождает вызов запроса на сервак через $http
3 - каждый вызов $http завершенный (да и вообще изменение статуса) порождает запуск $digest цикла
4 - возвращаемся к первому пункту
// Все люди ходят в туалет
// но обычно делают это в одном месте
function dataProviderFactory($http, $q) {
return {
getManufactures: getManufactures,
getCategories: getCategories,
getCategoryTree: getCategoryTree
};
function getManufactures () {
var sql = 'SELECT * FROM audio.w8265_virtuemart_manufacturers_ru_ru';
return exec(sql)
.then(function (data) {
return pluck(data, 'mf_name');
}, repeatError);
}
function getCategories(pid) {
var sql = 'SELECT virtuemart_category_id, category_name FROM audio.w8265_virtuemart_categories_ru_ru join audio.w8265_virtuemart_category_categories on virtuemart_category_id = category_child_id where category_parent_id = ' + (pid || 0);
return exec(sql)
.then(function (data) {
return pluck(data, 'category_name');
}, repeatError);
}
// а еще лучше уж тогда так:
function getCategoryTree() {
// get all categories
var sql = 'SELECT virtuemart_category_id as id, category_name, category_parent_id as parent_id FROM audio.w8265_virtuemart_categories_ru_ru join audio.w8265_virtuemart_category_categories on virtuemart_category_id = category_child_id';
return exec(sql)
.then(function (categories) {
return getChildren(categories);
// простенький рекурсивный обход дерева
function getChildren(collection, pid) {
pid = pid || 0;
return collection.filter(function (item) {
return item.parent_id == pid;
}).map(function (category) {
return {
name: category.category_name,
children: getChildren(collection, category.id)
}
});
}
}, repeatError);
}
// я думаю не стоит даже говорить насколько это плохо....
// я надеюсь что никто не увидит эту систему кроме как менеджеры какие-нибудь...
// ибо это нехилая такая дыра в безопасности
// да и вообще стремно
function exec(sql) {
return $http
.get('/ajax/index.php')
.then(function (response) {
// а если вы на сервере укажите Content-type application/json
// Angular будет делать вам это автоматом
return angular.fromJson(response.data);
}, repeatError);
}
function repeatError(reason) {
return $q.reject(reason)
}
function pluck(collection, key) {
return collection.map(function (item) {
return item[key];
});
}
}
// чистенький контроллер
function SearchController (dataProvider) {
var vm = this;
dataProvider.getCategoryTree().then(function (tree) {
vm.categories = tree;
});
}
ну и да. используйте controller as синтаксис:
<div ng-controller="SearchController as search">
<ul>
<li ng-repeat="item in search.tree">
</div>
короче мысль простая - вам вообще не нужно было дергать этот метод контроллера или вообще делать его.
еще одно замечание, вы сделали просто ужасные штуки в контроллере и приэтом еще и используете track by явно не понимая что это такое и зачем оно надо.