javascript - AngularJS。装修模型

标签 javascript json angularjs decorator

后端返回 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,那么我也需要在 Controller 逻辑中应用相同的更改);

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

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

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

然后在模板中使用它

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

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

关于javascript - AngularJS。装修模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27254134/

相关文章:

javascript - 将字符串转换为字母数组,然后输出每个 SPAN

javascript - 直接从 Javascript 代码访问 SVG 文件

json - 尝试从 Node.js 将文档插入 CouchDB 时出现 ' bad_request invalid_json' 错误

json - 使用 VBA 将 JSON 解析为 Excel

mysql - Rails ActiveSupport::JSON 导致非法指令错误

范围更改/资源更改后 AngularJS 滚动到底部

javascript - Angular-js uglify 下载的模块

javascript - AngularJS 嵌套作用域和更改 $parent 作用域变量

javascript - 将文件写入磁盘

javascript - 如何在openlayers 5中右键单击删除功能