2014-10-09 34 views
0

我正在關注Pro AngularJS的教程,我正在從HTTP API檢索一些產品。而不是使用Deployd,我想用RavenDB代替。如何使用AngularJS和RavenDB檢索ID作爲索引的一部分?

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發射剛剛從文件中的字段,甚至通過一)忽略元數據或b)明確地將標識特定指數或變壓器作爲一個領域。

回答

2

對於問題的第一部分,一個索引不會改變結果只是如何查詢數據的結果。所以用「id」字段創建索引不會做你想要的。如果你想改變結果,你需要使用變壓器。所以在你的情況下,你會創建一個像這樣的變壓器:

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.getId = function(product){ 
    return product["@metadata"]["@id"]; 
} 
+1

的'$ scope.getId()'聽起來像這裏的贏家。我可以把它放在一個服務,以減少重複? – 2014-10-10 09:36:21

+1

當然。您可能想從服務中獲取數據,然後將該方法添加到所有返回的對象中。這樣你就可以直接調用{{product.getId()}}。 – 2014-10-10 12:37:40