使用不同的嵌套json进行ng-repeat

时间:2015-08-14 20:14:52

标签: javascript html json angularjs

所以我有一个返回活动列表的API,但我必须一次获取2个项目,所以如果我在第一次调用时有3个项目,那么返回的json将是这样的:

cesta{ 
fecha="14/08/2015 2:42:28 PM",  
tipo="9",  
pagina="1",
total="3",
inst [{ 

    nu_doc_opened="N",  
    nu_doc="14",  
    nu_inst="1",  
    nb_wf{ 
        cdata_section="Gestión calendario específico"
        }
    },
    nu_doc_opened="N",  
    nu_doc="15",  
    nu_inst="2",  
    nb_wf{ 
        cdata_section="Gestión calendario general"
        }
    }]
}

并在下次调用时返回的json将是这样的

cesta{ 
fecha="14/08/2015 2:42:29 PM",  
tipo="9",  
pagina="2",
total="3",
inst { 
    nu_doc_opened="N",  
    nu_doc="16",  
    nu_inst="1",  
    nb_wf{ 
        cdata_section="Gestión calendario específico"
        }
    }
}

我想通过这个json来获取一些数据并把它放在一个表中,所以我试图像这样使用ng-repeat :(注意我只想得到一些值不是全部)

$scope.basket= data.cesta.inst;

<tbody>
    <tr ng-repeat="b in basket">
    <td>{{b.nu_doc}}</td>
    <td>{{b.nu_inst}}</td>
    <td>{{b.nb_wf.cdata_section}}</td>
    </tr>  
</tbody>

问题是,当json在'inst'中有2个或更多个对象时(例如在第一个例子中),因为它是一个数组,但当它只有一个对象不起作用时,这是有效的,我能做什么两种情况下的ng-repeat工作? 先谢谢

2 个答案:

答案 0 :(得分:4)

这是因为在第二种情况下,它获取对象,当迭代对象时,它获取属性和值而不是第一个数组中的对象。

将该对象包装在数组中然后它可以正常工作。

$ scope.basket = angular.isArray(data.cesta.inst)? data.cesta.inst:[data.cesta.inst];

答案 1 :(得分:1)

正如您所知,ng-repeat需要一个数组。如果你不能强制端点总是返回一个数组(即使只有一个数据对象),那么你可能不得不写一个hacky解决方法。

一个愚蠢的想法:

$scope.basket = data.cest.inst.length !== undefined ? data.cest.inst : [data.cest.inst]

我认为你得到了这个,但是如果没有,这就是$scope.basket需要成为一个数组的原因: 简而言之:ng-repeat需要一个数组。在第一种情况下,$scope.basket是一个对象数组,但在第二种情况下,它只是一个对象。在第二个中,您需要将对象放在数组(即[{nu_doc: ...}])内,以使格式一致。 (注意:只有一个对象的数组是可以的!)

例如,在第一种情况下,您得到:

$scope.basket = [{nu_doc: ...}, {nu_doc: ...}]

在编写ng-repeat语句时,它可以正常工作。

但在第二种情况下,你得到:

$scope.basket = {nu_doc: ...}

因此ng-repeat将遍历该对象上的属性(即nu_doc, nu_inst ...)而不是将其视为具有单个对象的数组,这正是您想要的。

所以你的第二件JSON需要是:

cesta{ 
fecha="14/08/2015 2:42:29 PM",  
tipo="9",  
pagina="2",
total="3",
inst [{ 
    nu_doc_opened="N",  
    nu_doc="16",  
    nu_inst="1",  
    nb_wf{ 
        cdata_section="Gestión calendario específico"
        }
    }
}]