我想像这样过滤一个对象:
<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很新,所以如果你们中的任何一位专家有这方面的经验,可以指出我应该追求的方向以及对这个方向的一些帮助理解!
答案 0 :(得分:0)
考虑一个解决方案:
在将对象属性传递给ng-repeat之前使用过滤器将对象属性转换为数组(即不要更改原始数据结构)。这是必要的......
创建一个额外的过滤器,它接受一个键名数组作为参数,并将过滤后的有序数组返回到ng-repeat
键名称数组可以是动态的,并且在运行时由用户更改。
我按照这些准则制作了Plunker containing a sample app。
该演示不包括您的初始对象映射过滤,因为所需的键名称是在数组内部传递的。但是如果您仍然需要使用这样的过滤器,比如说在用户重新排序之前可能是默认值,那么您可以将其重新添加。