4

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>

しかし、それは機能していません。

4

3 に答える 3

7

ng-repeat の優先度は 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>
于 2014-10-27T16:51:14.873 に答える
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>
于 2014-10-30T14:45:31.940 に答える