作为某些属性/对象的条件,ng-repeat中的Angular-UI预先输入

时间:2014-09-05 15:27:12

标签: javascript angularjs angular-ui angular-ui-typeahead

我们说我有这些数据可以输入我的ng-repeat:

[
  {
    "name": "Big Bird",
    "address": "abc street, san francisco california 00000",
    "object": [
      {"a": "b"},
      {"c": "d"},
      {"e": "f"}
    ]
  },
  {
    "address": "abc street, san francisco california 00000",
    "object": [
      {"a1": "b1"},
      {"c1": "d1"},
      {"e1": "f1"}
    ]
  }
]

我如何使用两种类型的过滤器对此ng-repeat应用typeahead,一个在地址上(使用谷歌地图地理编码api),另一个在嵌套项目的值上?并非所有的属性/对象都会出现,因此我猜测它必须是某种条件。我知道要使用的基本表达式是:<typeahead="x.z for x in y | filter:{z:$viewValue}">

非常感谢任何正确方向的推动,谢谢!

1 个答案:

答案 0 :(得分:0)

编辑:我让它部分工作,以便过滤掉一个属性。要从特定属性中提取,我在HTML(示例)中使用了它:

<div ng-repeat="stuff in stuffs">
  <input ng-model="someModel" typeahead="obj as obj[display(obj)] for obj in stuff.object">
</div>

Angular判断每个JSON对象中是否存在'object'属性,所以我将它包含在控制器的$ http.get中,这样当没有名为'object'的属性时,会为它创建一个空数组:

angular.forEach(stuffs, function(value, key) {
  if (!value.object) {
    value.object = [];
  }
});
K很酷。现在我想将显示结果限制为其值,而不是键,并且由于某种原因,typeahead想要验证这些实际上是对象,所以我把这个检查放在我的控制器中:

$scope.display = function(myObject) {
  if (myObject && myObject.constructor === Object) 
    return Object.keys(myObject)[0];
}; 

所以现在我们在ng-repeat中过滤了typeahead中的'object'属性,这意味着无论该属性存在于何处,它都只会键入该对象的结果,而不会包含任何其他包含相同属性的JSON对象。

现在,我担心过滤不起作用:它会过滤掉特定对象的'对象'属性的所有选项,无论输入什么内容。这就是我现在所处的位置,并且还试图弄清楚如何为另一个属性(地址)绑定另一个过滤器。