var appData = [
{
name: 'C++从入门到放弃',
author: 'dreamapple',
books: [
{name: 'github'},
{name: 'google'},
{name: 'nodejs'},
{name: 'react'}
]
},
{
name: 'Java从入门到跑路',
author: '呵呵哒',
books: [
{name: '雪碧'},
{name: '百事可乐'},
{name: '鸡尾酒'}
]
}
];
现在有这么一个要求,我需要将上面的那个 appData
循环出来,其中还要循环出来 books
里面的每一项,然后每一个 books
里面的每一项都可以进行删除,也可以给每一个 books
数组里面添加新的一项。
(1)循环出来这个 appData
数据还是很容易的,通过嵌套的 ngRepeat
很方便的就可以搞定了。
(2)关于嵌套我们能够使用的索引是 $index
,但是两层以上的话,如果每一层嵌套都使用 $index
作为索引的话,势必会引起混乱。这个时候就需要我们想一些办法去得到每一层的索引。
(3)我们目前比较好的一个做法就是通过 ngInit
指令,然后在循环开始的时候将每一层的索引保存在一个变量中,然后就可以在循环的不同层级之间使用了。
(4)我们还需要定义另一个数组 vmtempItem
,这个数组也用于循环,循环出来的每一项用作被添加项的数据模型。
注意:循环 books
数组我们还有一些需要注意的地方,我们要使用 track by
语法,不然每次增加或者删除 books
里面的内容时, books
每一项的 $index
不会发生变化,那么就不好进行删除 *** 作了。
我把里面的重点部分单独拿了出来,然后大家一起来看一看:页面部分:
<ul class="list-group" ng-repeat="item in vmappData" ng-init="outerIndex = $index">
<h3>{{itemname}}<span class="outer-index">outerIndex:{{outerIndex}}</span></h3>
<h4>{{itemauthor}}</h4>
<li class="list-group-item">
<ul class="list-group">
<li class="list-group-item" ng-repeat="v in itembooks track by $index" ng-init="innerIndex = $index">
{{vname}} <span class="inner-index">innerIndex:{{innerIndex}}</span><button class="btn btn-danger" ng-click="vmremoveItem(outerIndex, innerIndex)">删除</button>
</li>
<li class="list-group-item">
<form class="form-inline">
<input class="form-control" ng-model="vmtempItem[$index]" type="text">
<button class="btn btn-primary" ng-click="vmaddItem(outerIndex)">添加一项</button>
</form>
</li>
</ul>
</li>
<hr ng-show="!$last">
</ul>
控制器部分:
function removeItem(outerIndex, innerIndex) {
vmappData[outerIndex]bookssplice(innerIndex, 1);
}
我们可以先看控制器里面的函数, removeItem
这个函数有两个参数,一个是 outerIndex
,一个是 innerIndex
,其中 outerIndex
表示的是第一层循环的 $index
索引, innerIndex
表示的是第二层的 $index
索引。每次删除一项我们都需要知道是删除第一层循环中哪一个对象中的哪一项。
在页面中我们通过 ng-init="outerIndex = $index"
保存了第一层循环的 $index
,通过使用 ng-init="innerIndex = $index"
保存了第二层循环的 $index
。所以接下来的 *** 作都很方便了。
如果对我上面所说的还没有很好理解的话,你可以尝试自己练习一下。下面是源码部分:
HTML部分
<head>
<meta charset="UTF-8">
<title>1</title>
<link rel="stylesheet" href=">
解决方法:新手机放上电池首次开机,手机要做初始化的 *** 作,开机时间会较长,有可能被误认为不开机。对于电池过度放电造成的不开机,取下电池,手机连接充电器看能否开机,如可以开机,将电池装上充电30分钟以上,可正常开机。
现象二:手机放在口袋中,触摸屏与身体接触,此时来电无法划动触屏接听电话。
解决方法:保持手及触摸屏的清洁和干燥,击两下开机键(锁屏键),让触摸屏自身重新校准,然后在开锁试试。
不知道会不会有人看,说一下这个错误的原因
起因就是这段代码
thisdefaultTimeZone = (new Date)toString()split('(')[1]slice(0, -1);// (new Date)toString() => 运行结果不一致
先看可以运行的Chrom下的运行结果
Firefox
IE10
注意原插件中的这句
(new Date)toString()split('(') // 以'('分割可惜的是 除了chrom 其他两款浏览器的结果中并不存在'(',那么数组取[1]自然是undefined,最终导致报错
网上解决方案
将插件中的thisdefaultTimeZone=(new Date)toString()split("(")[1]slice(0,-1);改为thisdefaultTimeZone='GMT '+(new Date())getTimezoneOffset()/60;
以上就是关于如何在深层嵌套ngRepeat中获取不同层级的$index全部的内容,包括:如何在深层嵌套ngRepeat中获取不同层级的$index、使用bootstrap table不显示数据、bootstrap-datetimepicker 使用firefox浏览器运行测试不通过等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)