AngularJS。装饰模型

时间:2014-12-02 16:22:56

标签: javascript json angularjs decorator

Backend会像这样返回json:

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

如您所见,有countryIds属性。在客户端,我已经使用相应的ID缓存了国家/地区名称:

[ 
  {
    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方法将对象发送到服务器时,我不想将countries属性发送到服务器。我怎样才能以更优雅的方式处理这种情况?在我看来,几乎没有选择:

1.当向服务器发送对象时,只需删除所有不必要的属性(不好的方法,因为如果将新属性添加到JSON,那么我也需要在控制器逻辑中应用相同的更改);

2.不要使用新的countries proeprty来装饰对象,并公开一些应用程序级方法,如

  

$ rootScope.getCountryNamesByIds = getCountryNamesByIds;

然后在模板中使用它:

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

3.不要使用新的countries proeprty装饰对象,并创建名为countryNames的指令,该指令将根据国家ID生成国家/地区名称(如第2点所示):

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

你怎么想,什么选择更优雅?或者解决我的挑战的其他方法是什么?

1 个答案:

答案 0 :(得分:1)

我已多次遇到此问题,并尝试了所有解决方案。一般来说,我会做以下事情:

  1. 当我需要编辑和发送回来时,请不要装饰,而应使用单独的列表和查找,例如#2和#3。
  2. 什么时候我不需要编辑 - 例如使用你的例子,如果我需要为该对象添加注册,那么它实际上是一个单独的资源 - 然后装饰
  3. 第三种可能性是将其保存为对象的功能

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

    然后在模板中使用它

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

    仅供参考,我为ng-resource创建了一个补丁方法,所以我只能通过PATCH保存更改。在这里没有帮助,但却是同一个整体问题的一部分。在这种情况下,将它扩展为非常难以说明,&#34;只发回那些已经改变的项目,而不是任何添加的项目&#34;,这也可以解决它。