如何在返回数据之前操作来自 ngResource query() 的数据?
How to manipulate data from ngResource query() before returning it?
我正在尝试理解如何修改 $resource.query()
returns 的数据,事实证明,这些数据实际上并不是 $q
的 Promise,而是一个空的 object/array 异步调用完成后填充。
我定义了一个服务,我想在其中修改来自 $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);
但它 returns 对象而不是数组。
我不确定这是否是您正在寻找的完整答案,但它应该对您有所帮助:
Employee.query({...}) 本身不是承诺,但您可以像这样访问原始 $http 承诺:
Employee.query({...}).$promise.then(function(result){
console.log(result);
});
($resource 只是 $http 的包装。)
如果你不介意我这么说的话,在你检索资源的那一刻在客户端过滤你的资源的想法听起来好像与 API-resources 的想法背道而驰首先。请求“员工”的子集听起来确实像一个 API 功能,应该在服务器端实现。我会说你想像这样调用你的资源:
Employee.query({ managerId: employee.employeeId });
编辑:
好吧,我废弃了你的 Report
-factory(抱歉!),结果是:
// Controller
$scope.id = 1; // Or something...
$scope.employees = Employee.query();
// Html
<tr ng-repeat="employee in employees | filter: {employeeId: id} : true | orderBy:id">
这似乎也是一个可以接受的答案:
我正在尝试理解如何修改 $resource.query()
returns 的数据,事实证明,这些数据实际上并不是 $q
的 Promise,而是一个空的 object/array 异步调用完成后填充。
我定义了一个服务,我想在其中修改来自 $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);
但它 returns 对象而不是数组。
我不确定这是否是您正在寻找的完整答案,但它应该对您有所帮助:
Employee.query({...}) 本身不是承诺,但您可以像这样访问原始 $http 承诺:
Employee.query({...}).$promise.then(function(result){
console.log(result);
});
($resource 只是 $http 的包装。)
如果你不介意我这么说的话,在你检索资源的那一刻在客户端过滤你的资源的想法听起来好像与 API-resources 的想法背道而驰首先。请求“员工”的子集听起来确实像一个 API 功能,应该在服务器端实现。我会说你想像这样调用你的资源:
Employee.query({ managerId: employee.employeeId });
编辑:
好吧,我废弃了你的 Report
-factory(抱歉!),结果是:
// Controller
$scope.id = 1; // Or something...
$scope.employees = Employee.query();
// Html
<tr ng-repeat="employee in employees | filter: {employeeId: id} : true | orderBy:id">
这似乎也是一个可以接受的答案: