按对象中元素的名称过滤

时间:2014-05-23 16:26:18

标签: angularjs object

我想像这样过滤一个对象:

<td ng-repeat="(key,value) in contact | contactEditableFields">
<editable-string-field in-edit="contact.editing" original-string="contact[key]" editable-string="contact['editing'+key]">
</td>

我的自定义过滤器看起来像:

.filter('contactEditableFields', function (){                                                                     |~                                                                                                                     
  return function(contact){                                                                                       |~                                                                                                                     
    var contactEditFields = {};                                                                                   |~                                                                                                                     
    angular.forEach(contact, function (v,i){                                                                      |~                                                                                                                     
      if (i.search('editing') <0 && i!='pk' && i!='$$hashKey'){                                                   |~                                                                                                                     
        contactEditFields[i]=v; 
      }
    });
    return contactEditFields;                                                                                                                  
  };
})

我的contactobject在这些方面看了一些东西(属性没有特别的顺序),是的,这两种联系方式都会发生:

c = { firstName: "John", lastName: "Doe", pk: 1337, editing=false }

或:

c = { firstName: "John", editingfirstName: "Jane", lastName: "Doe", editinglastName:"Doe", pk: 1337, editing=true }

现在这可以按照我的意图运作 - 我的目的是让我很容易将新属性添加到我的&#34;联系人&#34;宾语。但是我现在希望在联系[&#39; firstName&#39;]之前订购自定义过滤器中输出的字段(即联系[&#39; lastName&#39;],然后再联系[&#39;] ;电子邮件&#39;]),我理解在我ng-repeat时依赖我订购的对象是不好的做法。

我已采取的方法来解决这个问题,我不喜欢/避免了解如何做的事情:

- 改变与数组的联系(可能是最糟糕的选择,我的数据库很好地给了我JSON联系人,而且我不想再把它搞乱了!)

- 以更好的方式进行编辑,而不仅仅是将主要字符串复制到新属性中,并在完成后删除这些额外属性

- 对每个参数进行编码(我是否太努力使这个优雅和美观,当它真的不可能?)

- 做一些过滤魔法?

我对AngularJS很新,所以如果你们中的任何一位专家有这方面的经验,可以指出我应该追求的方向以及对这个方向的一些帮助理解!

1 个答案:

答案 0 :(得分:0)

考虑一个解决方案:

  • 在将对象属性传递给ng-repeat之前使用过滤器将对象属性转换为数组(即不要更改原始数据结构)。这是必要的......

  • 创建一个额外的过滤器,它接受一个键名数组作为参数,并将过滤后的有序数组返回到ng-repeat

键名称数组可以是动态的,并且在运行时由用户更改。

我按照这些准则制作了Plunker containing a sample app

该演示不包括您的初始对象映射过滤,因为所需的键名称是在数组内部传递的。但是如果您仍然需要使用这样的过滤器,比如说在用户重新排序之前可能是默认值,那么您可以将其重新添加。

相关问题