AngularJS — принудительный рендеринг / повторный рендеринг / компиляция многократно повторяющегося div внутри директивы

#javascript #angularjs

#javascript #angularjs

Вопрос:

У меня есть div, который использует ng-repeat.

Я начинаю с нескольких элементов в массиве.

Я хотел бы принудительно отобразить первый элемент до того, как будет отображен следующий элемент. Причина этого заключается в зависимости от высоты каждого div

Есть ли способ сделать это?

 <div class='listOne'>
    <div ng-repeat='item in listOne'>{{item}}</div>
</div>
<div class='listTwo'>
    <div ng-repeat='item in listTwo'>{{item}}</div>
</div>
  

JS

 var myList = ['something', 'stuff', 'someOtherthing'];
var listOne = [];
var listTwo = [];

// decide which list to insert into
function decideListBasedOnHeight() { // returns array
    var listOneElement = // reference to listOne element
    var listTwoElement = // reference to listTwo element
    if (listOneElement.offsetHeight > listTwoElement.offsetHeight ) // the height here is zero for both
       return listTwo;
    return listOne;
}

forEach (myList, function(value) {
    decideBasedOnHeight().push(value);
});
  

Пример проблемы:http://plnkr.co/edit/XxJTzNlnQrB7S7tQ0PBL?p=preview
Второй пример:http://plnkr.co/edit/3pzpsgmQ0vIM1e6nuEQG?p=preview

Ответ №1:

Ммм, хороший вопрос.

Вы не могли бы получить массив, но продвигать его шаг за шагом с помощью директивы. Смотрите

 <div ng-contoller="ctrl">
    <div class='listOne'>
        <div ng-repeat='item in listOne' count-height-and-push-next="listOneHeight">{{item}}</div>
    </div>
    <div class='listTwo'>
        <div ng-repeat='item in listTwo' count-height-and-push-next="listTwoHeight">{{item}}</div>
    </div>
</div>

.directive('countHeightAndPushNext', function(){
   return{
       restrict: 'A',
       scope: true,
       link: function(scope, element, attrs){
           scope[attrs.countHeightAndPushNext]  = element[0].outerHeigth;
           scope.pushItem();
       }
   };

})

.controller('ctrl', function($scope){
    $scope.myList = ['something', 'stuff', 'someOtherthing'];
    $scope.listOne = [];
    $scope.listOneHeight = 0;
    $scope.listTwo = [];
    $scope.listTwoHeight = 0;

    var nextPushIndex = 0;
    $scope.pushItem = function(){
        if($scope.listOneHeight > $scope.listTwoHeight){
             $scope.listTwo.push($scope.myList[nextPushIndex])
        }else{
             $scope.listOne.push($scope.myList[nextPushIndex]);
        }
        nextPushIndex  ;
    };
    $scope.pushItem();
});
  

Мне действительно не нравится тесная связь в этом примере, и его абсолютно необходимо переработать и переделать, но это всего лишь идея. Возможно, не самый лучший, но он должен работать. Приветствия.

Комментарии:

1. Спасибо. Я обнаружил, что использование append также работает plnkr.co/edit/UyRS0clrCwDpSrYgBsXS?p=preview

2. Недавно я протестировал это совсем немного и обнаружил, что это не работает.

3. Вот рабочая версия . Но мне все еще не нравится тесная связь. Это просто идея.

4. Спасибо, что снова изучили это, но, похоже, это все еще не работает. jsfiddle.net/HB7LU/4873 Я обновил скрипку, похоже, она выполняет вычисления, но на самом деле работает некорректно.

5. Мой обходной путь для всего этого испытания заключается в использовании формулы для определения высоты div в зависимости от длины текста, она примерно на 90% точна и заметна только после сотен элементов в каждом столбце. Еще раз спасибо gopacrate