2014-12-02 88 views
0

後端返回JSON這樣的:AngularJS。裝飾模型

[ 
    { 
    id: 1, 
    name: "the name", 
    countryIds: [ 1,2,3] 
    }, ... 
] 

正如你可以看到有countryIds財產。在客戶端我已經緩存的國家名稱與對應的標識:

[ 
    { 
    id: 1, 
    name: "USA" 
    }, 
    { 
    id:2, name: "France" 
    }... 
] 

,所以檢索該對象時,我只需要添加新的countries財產,我指定國名:

obj.countries = getCountryNamesByIds(obj.countryIds); 

所以我最初的對象,然後看起來是這樣的:

{ 
     id: 1, 
     name: "the name", 
     countryIds: [ 1,2,3], 
     countries: ["USA", "France", "England"] 
     } 

的問題是,更新(使用PUT法)之後,發送對象到服務器時,我不想仙d到服務器的countries屬性。我如何以更優雅的方式處理這種情況?在我看來有幾個選擇:

1.當發送對象到服務器只是刪除所有不必要的屬性(壞方法,因爲如果新屬性將被添加到JSON,那麼我需要在控制器邏輯中也應用相同的更改);

2.不要裝飾用新countries媒體資源相關聯的對象,並且暴露出一些應用程序級的方法,如

$ rootScope.getCountryNamesByIds = getCountryNamesByIds;

,然後用它的模板:

<label> Countries </label> 
<div> {{getCountryNamesByIds(obj.countryIds)}} </div> 

3.不要裝飾物與新countries媒體資源相關聯,並創建名爲指令其countryNames將產生從國家的ID(國名作爲第2點):

<div country-names country-ids="obj.countryIds"> // There will be shown country names generated from their IDs</div> 

你怎麼想,有什麼選擇更優雅?或者有什麼其他方式來解決我的挑戰?

回答

1

我有這個問題的次數,並嘗試了所有的解決方案。在一般情況下,我會做到以下幾點:

  1. 當是我可能需要編輯併發送回,不裝修,而是使用一個單獨的列表和查找,喜歡你的#2,#3。
  2. 當它是我不需要編輯的東西 - 例如使用你的例子,如果我需要添加一個註冊爲對象,所以它實際上是一個單獨的資源 - 再裝點

第三種可能性是將其保存爲對象上的功能

obj.getCountries = function() {return [["USA", "France", "England"] ]; }; 

然後用它在

<div> {{obj.getCountries())}} </div> 

僅供參考,我創建了NG-資源補丁方法的模板,所以我只能保存通過PATCH的變化。在這裏沒有幫助,但是是同樣的整體問題的一部分。在這種情況下,擴展它並不難說:「只發回已更改的項目,不添加任何項目」,這也可以解決問題。