28

ng-repeatAngularJSを使用して次の HTML (Twitter Bootstrap Scaffolding) を表示するにはどうすればよいですか? 基本的に、3 レコードごとに を閉じて</div>を印刷し<hr>、別のレコードを開く必要があります。<div class="span4">

    <div class="row">
      <div class="span4">
        <h3>
          Project A
        </h3>
      </div>
      <div class="span4">
        <h3>
          Project B
        </h3>
      </div>
      <div class="span4">
        <h3>
          Project C
        </h3>
      </div>
    </div>

    <hr>

    <div class="row">
      <div class="span4">
        <h3>
          Project D
        </h3>
      </div>
      <div class="span4">
        <h3>
          Lab Title
        </h3>
      </div>
      <div class="span4">
        <h3>
          Project E
        </h3>
      </div>
    </div>

コードデモ用のフィドルを作成しました。
http://jsfiddle.net/ADukg/261/

4

5 に答える 5

17

より簡単な答えから進んでください。空の dom 要素が生成されるため、元のソリューションは嫌いです。これは、行ごとに 3 div です。

<div ng-controller="ModulesCtrl">
    <div class="row" ng-repeat="i in fields.range()">
        <div class="span4" ng-repeat="field in fields.slice(i,i+3)">
            <h2>{{field}}</h2>
        </div>
    </div>
</div>

関数 FieldsCtrl($scope) では:

$scope.fields.range = function() {
    var range = [];
    for( var i = 0; i < $scope.fields.length; i = i + 3 )
        range.push(i);
    return range;
}

fields.length がわかっている場合は、 fields.range() の代わりに [0,3,6,9] などを使用できます

于 2013-07-07T09:36:57.533 に答える
15

よりエレガントな方法は、ビューモデルを使用してチャンクコレクションを提供し、ビューにそれを次のように処理させることです

<div ng-controller="Controller">
    Projects <input ng-model="projects"></input>
    <hr/>
    <div ng-repeat="row in rows">
        <div ng-repeat="project in row">
            Projects {{project}}
        </div>
        <hr/>
    </div>
</div>​

そしてcoffeescriptはとてもシンプルです

# Break up an array into even sized chunks.
chunk = (a,s)->
    if a.length == 0
        []
    else               
        ( a[i..i+s-1] for i in [0..a.length - 1 ] by s)

@Controller = ($scope)->
    $scope.projects = "ABCDEF"

    $scope.$watch "projects", ->      
       $scope.rows = chunk $scope.projects.split(""), 3

angular.bootstrap(document, []);

</p>

http://jsfiddle.net/ADukg/370/

于 2012-07-14T10:11:56.040 に答える
2

ビュー ロジックをコントローラーから除外し、より再利用可能なソリューションにするために、配列を行グループに分割するカスタム フィルターを作成できます。

angular.module('app').filter('group', function() {
    /**
     * splits an array into groups of the given size
     * e.g. ([1, 2, 3, 4, 5], 2) -> [[1, 2], [3, 4], [5]]
     */
    return function(array, groupSize) {
        return _.groupBy(array, function(val, index) {
            return Math.floor(index / groupSize);
        });
    };
});

そしてビューで:

<div class="row" ng-repeat="group in projects | group:3">
   <div class="span4" ng-repeat="project in group">
      {{project}}
   </div>
</div>

時間を含めるには、ng-repeat の開始点と終了点を使用できます。

<div class="row" ng-repeat-start="group in projects | group:3">
   <div class="span4" ng-repeat="project in group">
      {{project}}
   </div>
</div>
<hr ng-repeat-end />
于 2013-10-15T10:39:58.120 に答える
2

ng-repeat-start および ng-repeat-end エンドポイントは、これを達成するための便利な方法のようです:

シンプルなコードにつながる

<div ng-controller="MyCtrl">
    <div ng-repeat-start="project in projects">
        <span>
            <div class="row">
                <h3 class="span4">{{project}}</h3>
            </div
        </span>
    </div>
    <hr ng-repeat-end ng-if="($index + 1) % 3 == 0" />
</div>

このjsfiddleを参照してください

于 2014-11-01T11:28:25.283 に答える