English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
서론
모두가 알지만, 작은 데이터 집합을 처리할 때는 ng-repeat는 매우 유용하지만, 매우 큰 데이터 집합을 처리할 때는 사용자 정의 메서드를 사용하는 것이 더 좋습니다. 특히 데이터가 대부분 정적이거나 미리 저장된 경우, ng-repeat 지시.
ng-repeat의 표현식과 $watch
Angular의 표현식은 모두 $watch의 Scope 함수를 생성합니다. 모델이 변경될 때마다 감지하고 알림을 주는 데 사용됩니다. ng-repeat 지시에서, 어떤 행 데이터가15데이터가 바인딩된 열 데이터가 있으면1000행 이상이면, $watch는 또 한 번 보너스를 받습니다.15000개가 있으면, 이 성능은 상상할 수 없을 정도로 좋습니다.
따라서 우리가 ng-repeat의 기능을 성능과 함께 가지고 싶다면, 다른 방법을 찾아야 합니다.
ng-repeat 메서드
내용이 정적이면, 두 가지 방법의 바인딩을 필요하지 않으며, {{::value}}를 단 한 번 실행하면 됩니다. 만약 angularJS가1.3아래의 구버전은 일회성 바인딩 문법을 지원하지 않습니다. 따라서 가장 좋은 방법은 사용자 정의 지시를自定义 지시를 만드는 것이며, 다시 말해, 정적 데이터는 간단한 방법으로 포맷할 수 있습니다.
구현 단계
1、먼저 불연속 목록을 생성하여 동적으로 바인딩된 내용을 저장합니다.
리스트를 표시하기 위해 사용할 컨테이너로 UL 태그를 생성합니다.
List 데이터를 동적으로 로드하려면, 먼저 div 태그를 추가하고 "repeater"라는 이름을 지정합니다.-alternative"를 통해 스트림에 렌더링용.
<div> <ul> <div repeater-alternative></div> </ul> </div>
2、List 데이터 정의:
//예제 데이터 var studentsList = [ { FirstName: "Raj, LastName : "B", Country : "India", BirthDate: "01/01/1990" }, { FirstName: "Kumar, LastName : "S", Country : "India", BirthDate: "01/01/1990" }, .................. .................. .................. .................. ]; $scope.collectionObject = studentsList; //分配给$scope函数
3、实际List内容
主要目的是适用于重复集合对象,并显示到列表中,所以需要制定访问循环的逻辑,并按照需求来格式化字符串。
var tableRow = ""; angular.forEach($scope.collectionObject, function (item) { tableRow = tableRow + ['<li>', '<div class="col-md-1">' + item.FirstName + '</div> '<div class="col-md-1 ">' + item.LastName + '</div> '<div class="col-md-1 ">' + item.Country+ '</div> '<div class="col-md-1 ">' + item.Id + '</div> '<div class="col-md-1 ">' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '</div> '</li>'].join(''); });
4、List格式化逻辑
一旦collectionObject的值已被赋给其他变量,就需要定义显示数据的表格。
5、如何获取分配CollectionObject的时间
Angular会监控$scope变量的值的变化,一旦值被修改,则$watch将被触发,所以需要将CollectionObject的赋值逻辑放到$scope变量的$watch中。
下面的代码:
$scope.$watch($scope.object, function (oldValue, newValue) { })
也就是说,当我们执行赋值语句时,Angular会处理这个事件,并格式化List的内容。
$scope.$watch('collectionObject', function (oldValue, newValue) { var tableRow = ""; angular.forEach($scope.collectionObject, function (item) { tableRow = tableRow + ['<li>', '<div class="col-md-1">' + item.FirstName + '</div> '<div class="col-md-1 ">' + item.LastName + '</div> '<div class="col-md-1 ">' + item.State + '</div> '<div class="col-md-1 ">' + item.Id + '</div> '<div class="col-md-1 ">' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '</div> '</li>'].join(''); }); })
接下来就是将内容渲染到表格控件中,也就是HTML<DIV>repeater-在"alternative"标签中。
首先必须理解Angular的Directive机制,简单来说,就是我们指示Angular,当指定的变量被发现时,就开始执行后台操作。
var userDirectives = angular.module([]); userDirectives.directive('DOMElementFound', function () { return { replace: true, function ($scope, $elem, attrs) { //后台处理操作 } } });
我们将通知Angular,当发现"repeater-如果在"alternative"元素中,则将以下数据渲染到列表行中。
下面的代码:
var userDirectives = angular.module([]); userDirectives.directive('repeaterAlternative', function () { return { replace : true, function ($scope, $elem, attrs) { $scope.$watch('collectionObject', function (oldValue, newValue) { var tableRow = ""; angular.forEach($scope.collectionObject, function (item) { tableRow = tableRow + ['<li>', '<div class="col-md-1">' + item.FirstName + '</div> '<div class="col-md-1 ">' + item.LastName + '</div> '<div class="col-md-1 ">' + item.State + '</div> '<div class="col-md-1 ">' + item.Id + '</div> '<div class="col-md-1 ">' + $filter('date')(item.BirthDate, 'dd-MMM-yyyy') + '</div> '</li>'].join(''); }); //IE가 주요 브라우저라면, 성능을 향상시키기 위해 innerHTML를 권장합니다. $elem.context.innerHTML = tableRow; //IE가 주요 브라우저가 아니라면, 요소에 컨텐츠를 추가하는 것만으로도 충분합니다. //$elem.append(tableRow); }); } } });
결론
이 기사에서는 ng를 주로 모의했습니다.-repeat의 작동 방식과 논리는 동일하지만, 이는 정적 내용에 한정되므로, 호출된 ng와의 출력 결과는 동일합니다.-repeat 결과는 동일하지만, 이 메서드는 단일 데이터 바인딩 방식과 적은 $watch로 빠르게 렌더링됩니다. 이 기사의 모든 내용이며, 이 기사의 내용이 여러분의 학습이나 업무에 도움이 되길 바랍니다. 궁금한 점이 있으면 댓글을 달고 교류하세요.