我知道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>
但它没有用。
答案 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