Создание собственного ng-repeat, чтобы избежать $watch в angularjs
Я использую пользовательскую директиву для ng-repeat, чтобы избежать $watch
.Я попытался изменить директиву во всех возможных случаях, чтобы пропустить $watchCollection()
, Но без этого я не могу получить доступ к данным в директиве.
Можно ли создать директиву, которая получит значение модели из DOM и обновить страницу DOM, не создавая $watch
?
следующий myRepeatDirective
есть все, что я хочу воссоздать эту директиву без $watch
,
Я устал использовать одноразовую привязку (::
) с ng-repeat
но это работает с нумерацией страниц. Сетка не обновляется после загрузки.
Заранее спасибо.
.directive('myRepeat', [ '$animate', function($animate) {
var updateScope = function(scope, index, valueIdentifier, value, key, arrayLength) {
scope[valueIdentifier] = value;
scope.$index = index;
scope.$first = (index === 0);
scope.$last = (index === (arrayLength - 1));
scope.$middle = !(scope.$first || scope.$last);
scope.$odd = !(scope.$even = (index&1) === 0);
};
return {
restrict: 'A',
transclude: 'element',
compile: function($element, $attrs) {
var expression = $attrs.myRepeat;
var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)?\s*$/);
var valueIdentifier = match[1];
var collection = match[2];
return function($scope, $element, $attr, ctrl, $transclude) {
$scope.$watchCollection(collection, function(collection) {
var index, length,
previousNode = $element[0],
collectionLength,
key, value;
collectionLength = collection.length;
for (index = 0; index < collectionLength; index++) {
key = index;
value = collection[key];
$transclude(function(clone, scope) {
$animate.enter(clone, null, angular.element(previousNode));
previousNode = clone;
updateScope(scope, index, valueIdentifier, value, key, collectionLength);
});
}
});
}
}
}
}]);