2014-12-02 54 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的变化。在这里没有帮助,但是是同样的整体问题的一部分。在这种情况下,扩展它并不难说:“只发回已更改的项目,不添加任何项目”,这也可以解决问题。