我在我的代码中使用ng-repeat我有基于ng-repeat的n个文本框。我想将文本框与三列对齐。
这是我的代码
<div class="control-group" ng-repeat="oneExt in configAddr.ext">
{{$index+1}}.
<input type="text" name="macAdr{{$index+1}}"
id="macAddress" ng-model="oneExt.newValue" value=""/>
</div>
最可靠,技术上最正确的方法是在控制器中转换数据。这是一个简单的块函数和用法。
function chunk(arr, size) {
var newArr = [];
for (var i=0; i<arr.length; i+=size) {
newArr.push(arr.slice(i, i+size));
}
return newArr;
}
$scope.chunkedData = chunk(myData, 3);
然后您的视图将如下所示:
<div class="row" ng-repeat="rows in chunkedData">
<div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>
如果您在中有任何输入ng- repeat
,则可能需要在修改数据或提交数据后取消整理/重新加入数组。这是在中的外观$watch
,以便始终以原始合并格式提供数据:
$scope.$watch('chunkedData', function(val) {
$scope.data = [].concat.apply([], val);
}, true); // deep watch
许多人喜欢在视图中使用过滤器来完成此操作。这是可能的,但只能用于显示目的!如果在此过滤后的视图中添加输入,将导致 可以 解决的问题,但
不是很漂亮或不可靠 。
该过滤器的问题在于它每次都会返回新的嵌套数组。Angular正在监视过滤器的返回值。过滤器第一次运行时,Angular会知道该值,然后再次运行它以确保完成更改。如果两个值相同,则循环结束。如果不是,过滤器将一次又一次地触发直到它们相同为止,否则Angular意识到正在发生无限摘要循环并关闭。由于新的嵌套数组/对象以前没有被Angular跟踪,因此它总是将返回值视为与以前的值不同。要修复这些“不稳定”的过滤器,必须将过滤器包装在一个memoize
函数中。lodash
具有memoize
功能,而lodash的最新版本也包含chunk
功能,因此我们可以使用以下方法非常简单地创建此过滤器npm
模块并使用browserify
或编译脚本webpack
。
记住:仅显示! 如果使用输入,请过滤控制器!
安装lodash:
npm install lodash-node
创建过滤器:
var chunk = require('lodash-node/modern/array/chunk');
var memoize = require('lodash-node/modern/function/memoize');
angular.module('myModule', [])
.filter('chunk', function() {
return memoize(chunk);
});
这是带有此过滤器的示例:
<div ng-repeat="row in ['a','b','c','d','e','f'] | chunk:3">
<div class="column" ng-repeat="item in row">
{{($parent.$index*row.length)+$index+1}}. {{item}}
</div>
</div>
1 4
2 5
3 6
对于垂直列(从上到下列出),而不是水平列(从左到右),确切的实现取决于所需的语义。划分不均匀的列表可以以不同的方式分布。这是一种方法:
<div ng-repeat="row in columns">
<div class="column" ng-repeat="item in row">
{{item}}
</div>
</div>
var data = ['a','b','c','d','e','f','g'];
$scope.columns = columnize(data, 3);
function columnize(input, cols) {
var arr = [];
for(i = 0; i < input.length; i++) {
var colIdx = i % cols;
arr[colIdx] = arr[colIdx] || [];
arr[colIdx].push(input[i]);
}
return arr;
}
但是,获取列的最直接,最简单的方法是使用 CSS列 :
.columns {
columns: 3;
}
<div class="columns">
<div ng-repeat="item in ['a','b','c','d','e','f','g']">
{{item}}
</div>
</div>
问题内容: 我正在开发一个页面,我需要在其中显示一些框(使用),其中包含频道信息以及显示位置(城市)。 我面临的问题是当我重复第二遍时: 这应该获得第一个ng-repeat的$ index值,并使用显示频道的位置创建一个新数组。它确实做到了。但是,当我使用此数组应用第二个ng- repeat时,它无法正常工作。 说我的html看起来像这样(PS:我需要使用索引值而不是因为我将这些框放到列中) JS
问题内容: 我正在尝试将页面添加到我的列表中。我遵循了有关智能手机的AngularJS教程,我试图仅显示一定数量的对象。这是我的html文件: 我添加了带有某些值的select标记,以限制将要显示的项目数。我现在想要的是添加分页以显示下一个5、10等。 我有一个与此相关的控制器: 而且我还有一个模块,以便从json文件中检索数据。 问题答案: 如果您没有太多数据,则可以通过将所有数据存储在浏览器中
问题内容: 我想使用父列表(foos)的索引作为子列表(foos.bars)中函数调用的参数。 我发现了有人建议使用$ parent。$ index的帖子,但不是的属性。 如何访问父级的索引? 问题答案: 我的示例代码是正确的,问题出在我的实际代码中。不过,我知道很难找到这样的例子,所以我在回答别人的情况。
问题内容: 我想在ng-repeat中使用正则表达式。我尝试了以下代码,但无法正常工作。 我有用户数组,我只想显示类型为c5的用户。 如果我用 然后它也以“ ac5x”类型显示用户,因为它包含c5。 我怎么解决这个问题?也许还有另一种解决方案。 谢谢! 问题答案: Tosh提到的内容应该对您有用! 如果您发现自己想更频繁地使用正则表达式进行过滤,则可以创建一个自定义过滤器。像这样的小提琴使您可以指
问题内容: 我剖析了ng-repeat并提取了附加的代码块,看到它们包含处理 重复 算法的逻辑(我想了解它的工作原理)。 我有很多问题,但是由于它们都是关于ng- repeat的内部结构,因此我选择在这里全部询问。我看不出有任何理由将它们分为不同的SO问题。我已标记内联每个问题所指向的代码行。 为什么他们需要确保这不是本机函数?(这就是该功能的作用,是Angular内部API的一部分) 就我的直觉
问题内容: 除了呈现对象中属性的值之外,我还想将属性名称呈现为标签。有办法做到这一点吗?例如: 可能会吐出这样的东西: 问题答案: 试试这个: