Фильтры не работают с массивом из ресурса

У меня есть фильтр, который ничего не возвращает, когда он запускается на массиве с фабрики. Но когда я копирую массив прямо в фильтр, он работает нормально. Должно быть простое решение, и оно сводит меня с ума.

Это работает:

$filter('filter')([
  {"name":"firstItem","code":"one"},
  {"name":"secondItem","code":"two"},
  {"name":"thirdItem","code":"three"}
],"two",true);

Это не:

$filter('filter')($scope.items,"two",true);

Угловой образец:

angular.module('App', ['ngResource'])

.controller('Ctrl', function($scope, $filter, Items) {
  $scope.items = Items.query();
  var codeToFilter = "two";
  $scope.badFilter = $filter('filter')($scope.items,codeToFilter,true);
  $scope.goodFilter = $filter('filter')([
    {"name":"firstItem","code":"one"},
    {"name":"secondItem","code":"two"},
    {"name":"thirdItem","code":"three"}
  ],"two",true);
})

.factory("Items", function ($resource) {
    return $resource("item-list.asp");
});

И массив, возвращенный из item-list.asp:

[{"name":"firstItem","code":"one"},{"name":"secondItem","code":"two"},{"name":"thirdItem","code":"three"}]

Вот что я вижу на странице:

Bad Filter: []
Good Filter: [{"name":"secondItem","code":"two"}]

person psnoonan    schedule 06.03.2015    source источник


Ответы (2)


Items.query() является асинхронным и, следовательно, не разрешается мгновенно. На момент срабатывания фильтра он не заполняется.

Настройте это так:

Items.query(function(result) {
    $scope.items = result;
    $scope.badFilter = $filter('filter')($scope.items,codeToFilter,true);
});
person Tom    schedule 06.03.2015
comment
Спасибо за ответ! Теперь я получаю TypeError: undefined is not a function в строке Items.query. - person psnoonan; 06.03.2015

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

.controller('Ctrl', ['$scope', '$filter', 'Items', function($scope, $filter, Items) {

а затем не забудьте закрыть квадратную скобку после того, как функции закроют фигурную скобку

person Dan    schedule 06.03.2015
comment
Это именно то, что он делает, за исключением того, что вы сделали его безопасным для минимизации :) - person Tom; 06.03.2015
comment
Мне всегда было интересно, почему мы это сделали! Я просто знаю, что обычно в этом и заключаются мои проблемы. Все еще изучаю Angular, рад, что ваш ответ помогает. - person Dan; 06.03.2015