我正在关注Pro AngularJS的教程,并且我正在从HTTP API中检索一些产品。我没有使用Deployd,而是希望使用RavenDB。
根据this post的建议,我可以使用动态索引来获取所有这样的产品:
http://localhost:8080/databases/Catalogue/indexes/dynamic/Products
这导致JSON像这样:
{
Results: [
{
name: "Kayak",
description: "A boat for one person",
category: "Watersports",
price: 275,
@metadata: {
Raven-Entity-Name: "Products",
@id: "products/1",
Temp-Index-Score: 0.882217,
Last-Modified: "2014-10-07T20:26:31.4436923Z",
Raven-Last-Modified: "2014-10-07T20:26:31.4436923",
@etag: "01000000-0000-0001-0000-000000000001"
}
},
{ ... }
AngularJS的样本会产生这样的结果:
$http.get(dataUrl)
.success(function(result) {
$scope.products = result.Results;
});
使用此方法时,ID将存储为product["@metadata"].["@id"]
,这在受影响的网页上有点难以绑定,而不是product.id
。在尝试显示ID时,将ID重新发布以便从篮子中删除,您可以执行以下操作:
<table>
<tr ng-repeat="product in products">
<td>{{product["@metadata"]["@id"]}}</td>
<!-- other columns -->
</tr>
</table>
解决此问题的另一种方法是基本上动态创建ID,如下所示:
$http.get(dataUrl)
.success(function (result) {
var localResults = [];
for (var i = 0; i < result.Results.length; i++) {
localResults.push(result.Results[i]);
localResults[i].id = result.Results[i]["@metadata"]["@id"];
};
$scope.data = {
products: localResults
};
});
我尝试创建明确调出ID的索引,例如:
// Index: Products/All
from product in docs.Products
select new {
id = product.Id,
name = product.Name,
category = product.Category,
description = product.Description,
price = product.Price
}
但该文件格式与以前完全相同。
我的问题是:
RavenDB是否可以仅发出文档中的字段,即使是通过a)忽略元数据的特定索引或变换器,或b)明确地将ID添加为字段。
答案 0 :(得分:2)
对于问题的第一部分,索引不会改变结果只显示查询数据的方式。因此,使用&#34; id&#34;创建索引领域不会做你想要的。如果要更改结果,则需要使用变压器。因此,在您的情况下,您将创建一个变换器,如:
from product in results
select new
{
id = product.Id,
name = product.Name,
category = product.Category,
description = product.Description,
price = product.Price
}
比你需要将变压器绑定到你的索引。所以你的网址看起来像这样:
http://localhost:8080/databases/Catalogue/indexes/dynamic/Products?resultsTransformer=ProductTransformer
希望有所帮助。
作为替代建议,如果您不想使用变压器。在角度你可以做这样的事情:
<table>
<tr ng-repeat="product in products">
<td>{{getId(product)}}</td>
<!-- other columns -->
</tr>
</table>
然后在$ scope:
$scope.getId = function(product){
return product["@metadata"]["@id"];
}