2016-11-02 2 views
2

Я использую typeahead UI-bootstrap для фильтра поиска, теперь я использую данные от контроллера, но я хочу, чтобы данные из JSON использовались с помощью $ http. Но я не могу принимать данные из запроса $ http в функции фильтра.использовать функцию фильтра используя http-запрос в угловом

текущий код

// Search Control 
vm.searchCtrl = ""; 
var searchitems = [{ 
     "name": "Adventure", 
     "category": "Activities" 
    }, { 
     "name": "Cycling", 
     "category": "Activities" 
    }, { 
     "name": "Local guided tours", 
     "category": "Activities" 
    }, { 
     "name": "Delux room", 
     "category": "Accommodations" 
    }, { 
     "name": "Super Delux room", 
     "category": "Accommodations" 
    }, { 
     "name": "Goa", 
     "category": "Destinations" 
    }, { 
     "name": "Bengaluru", 
     "category": "Destinations" 
    }]; 

    vm.getSearchitems = function (search) { 
     var filtered = filterFilter(searchitems, search); 
     var results = _(filtered).groupBy('category').map(function (g) { 
      g[0].firstInCategory = true; 
      return g; 
     }).flatten().value(); 

     return results; 
    } 

Но сейчас я хочу, как этот

$http.get('../assets/data/search.json').then(function (response) { 
    return vm.searchitems = response; 
}); 
vm.getSearchitems = function (search) { 
    var filtered = filterFilter(searchitems, search); 
    var results = _(filtered).groupBy('category').map(function (g) { 
     g[0].firstInCategory = true; 
     return g; 
    }).flatten().value(); 

    return results; 
} 

Но "searchitems" не получают.

+0

Поскольку это асинхронный вызов, это может не возвращать данные во время выполнения функции. Либо вводите в контроллер, либо сохраняйте объект кеш/сервис во время первого попадания веб-сайта. –

+0

Эти асинхронные проблемы возникают постоянно в Angular. См. Мой ответ ниже, который показывает, как вызывать функцию только после того, как $ http возвращает данные. – Toddsden

ответ

0

Вы хотите использовать свою функцию только после того, как у вас есть данные из $ http. Поэтому переместите свой вызов в getSearchItems, чтобы он вызывался из $ http.

$http.get('../assets/data/search.json').then(function (response) { 
    return vm.getSearchitems(response); 
}); 
vm.getSearchitems = function (search) { 
    var filtered = filterFilter(searchitems, search); 
    var results = _(filtered).groupBy('category').map(function (g) { 
    g[0].firstInCategory = true; 
    return g; 
    }).flatten().value(); 
    return results; 
} 
Смежные вопросы