Как манипулировать данными из запроса ngResource () перед его возвратом?

Я пытаюсь понять, как я могу изменить данные, которые $resource.query() возвращает, который - как оказалось - на самом деле не обещание от $q но пустой объект / массив, который должен быть заполнен, когда асинхронный вызов сделан.

Я определил сервис, где я хотел бы изменить данные, которые пришли $resource (отфильтруйте это, чтобы быть точным), но ничто фактически не фильтруется. Я получаю весь массив обратно.

Я уверен, что здесь есть какая-то тривиальная вещь, которую мне не хватает. Спасибо за помощь заранее.

Вот услуга (Сотрудник $resource):

  factory('Report', ['Employee',
        function(Employee) {

            var query = function(id, cb) {
                return Employee.query({}, function(data) {
                    return cb(data, id);
                });
            };

            var findByManager = function(employees, employeeId) {
                return employees.filter(function(element) {
                    console.log(element);
                    return employeeId === element.managerId;
                });

            };

            return {
                query: function(employee) {
                    return query(employee.employeeId, findByManager);
                }
            }; 
        }
  ]);

РЕДАКТИРОВАТЬ

По предложению ippi я также попытался получить доступ к базовому обещанию:

var query = function(id) {
            return Employee.query().$promise
                .then(function(data) {
                    return findByManager(data, id);
                });
        };

return {
    query: query,
}

В контроллере:

$scope.employees = Report.query(id);

Но он возвращает объект вместо массива.

1 ответ

Решение

Я не уверен, что это полный ответ, который вы ищете, но он должен помочь:

Employee.query ({...}) сам по себе не является обещанием, но вы МОЖЕТЕ получить доступ к необработанному обещанию $http следующим образом:

Employee.query({...}).$promise.then(function(result){
    console.log(result);
});

($ resource - это просто оболочка для $http.)

И если вы не возражаете, я так говорю, идея фильтровать ваши ресурсы на стороне клиента, как только вы их извлекаете, звучит так, как если бы она с самого начала работала против идеи с API-ресурсами. Запрос подмножества "Сотрудников" наверняка звучит как API-функция и, вероятно, должен быть реализован на стороне сервера. Я бы сказал, что вы хотите назвать свой ресурс как:

Employee.query({ managerId: employee.employeeId });

Редактировать:

Хорошо, я пересмотрел твои Report-фактори (извините!) и в конечном итоге:

// Controller
$scope.id = 1; // Or something...
$scope.employees = Employee.query();

// Html
<tr ng-repeat="employee in employees | filter: {employeeId: id} : true | orderBy:id">

Похоже, что это также может быть приемлемым ответом: /questions/2200482/filtryi-ne-rabotayut-s-massivom-iz-resursa/2200494#2200494

Другие вопросы по тегам