【问题标题】:AngularJS. Decorating model角JS。装饰模型
【发布时间】:2015-01-30 23:28:11
【问题描述】:

后端返回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.不要用new 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>

你怎么看,哪个选项更优雅?或者还有什么其他方法可以解决我的挑战?

【问题讨论】:

    标签: javascript json angularjs decorator


    【解决方案1】:

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

    1. 如果我可能需要编辑并发回某些内容,请不要装饰,而是使用单独的列表和查找,例如您的 #2 和 #3。
    2. 当它是我不需要编辑的东西时 - 例如使用您的示例,如果我需要为该对象添加注册,那么它实际上是一个单独的资源 - 然后装饰

    第三种可能是将其保存为对象上的函数

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

    然后在模板中使用

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

    仅供参考,我为 ng-resource 创建了一个补丁方法,因此我只能通过 PATCH 保存更改。在这里没有帮助,但它是同一个整体问题的一部分。在这种情况下,扩展为“只发回已更改的项目,而不是添加任何内容”并不难,这样也可以解决问题。

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 2016-12-14
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2013-01-09
      • 2011-12-15
      • 2013-05-07
      • 1970-01-01
      相关资源
      最近更新 更多