当前位置: 首页 > 面试题库 >

如何使用引导程序将ng-repeat数据分为三列

阚小云
2023-03-14
问题内容

我在我的代码中使用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的一部分) 就我的直觉

  • 问题内容: 除了呈现对象中属性的值之外,我还想将属性名称呈现为标签。有办法做到这一点吗?例如: 可能会吐出这样的东西: 问题答案: 试试这个: