非数组对象上的ng-repeat

时间:2014-10-27 16:43:14

标签: javascript arrays angularjs angularjs-ng-repeat angular-ng-if

我知道ng-repeat只适用于数组。

我的问题是当我不知道从服务器获取的对象是数组还是仅对象时。
我需要动态确定它的数组或对象,并且只有当它的数组使用ng-repeat时才需要。

我的问题是,只有当对象是一个数组时,使用ng-repeat和条件的最佳方法是什么?

我试图用这种方式解决问题:

 <div ng-if="Array.isArray(myObj)"ng-repeat="item in myObj">
      <do-some-stuff item='item'></do-some-stuff>
 </div>
 <do-some-stuff ng-if="!Array.isArray(myObj)" item='myObj'></do-some-stuff>

但它没有用。

3 个答案:

答案 0 :(得分:6)

ng-repeat priority为1000,ng-if优先级为600.所以ng-repeat先执行,然后执行ng-if。这就是你的代码不工作的原因。使用此代码:

<div ng-if="Array.isArray(myObj)">
      <div ng-repeat="item in myObj">
          <do-some-stuff item='item'></do-some-stuff>
      </div>
 </div>
 <do-some-stuff ng-if="!Array.isArray(myObj)" item='myObj'></do-some-stuff>

答案 1 :(得分:0)

指令的优先权可能会出问题,但我认为在原因中,真正的原因是在其他地方。

Angular尝试在当前$ scope上搜索Array.isArray()的定义。 而且找不到它。

你必须向你的控制器添加对$ window的引用,然后声明你自己的函数来检查对象是否是数组。

类似这样的事情

控制器:

 $scope.isArray = function(obj) { 
  //Check if Array.isArray is available (is not supported in IE8)
  var fn = $window.Array.isArray || $window.angular.isArray;
  return fn(obj);
 }

HTML

<div ng-if="isArray(myObj)">
      <div ng-repeat="item in myObj">
          <do-some-stuff item='item'></do-some-stuff>
      </div>
 </div>
 <do-some-stuff ng-if="!isArray(myObj)" item='myObj'></do-some-stuff>

答案 2 :(得分:0)

这也可以通过另一种方式实现。

您可以根据条件返回所需的数组或空值 使用 testForArray 功能

<div  ng-repeat="item in testForArray()">
      <span>{{item.name}}</span>
      <do-some-stuff item='item'></do-some-stuff>
 </div>

在此功能中,您可以检查所需的逻辑 数据是数组还是对象

var myObj = [{name : '1'},{name : '3'},{name : '3'}]


      $scope.testForArray = function(){
        console.log("hello")
        if(angular.isArray(myObj)){
          return myObj
        }else{
          return []; 
        }

      }

以下是plunker