Как манипулировать данными из запроса 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