як розділити дані ng-повторів на три стовпці за допомогою завантажувальної програми


122

Я використовую ng-повтор зі своїм кодом. У мене є текстове поле 'n' на основі ng-повтору. Я хочу вирівняти текстове поле з трьома стовпцями.

це мій код

<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>

1
тож припускаючи, що у вас є дев'ять (9), ви хочете 1,2,3 підряд або у стовпці?
Габріеле Петріолі

Відповіді:


254

Найбільш надійний і технічно правильний підхід - це перетворення даних в контролер. Ось така проста функція та використання.

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, ви, ймовірно, захочете зняти / знову приєднатися до масивів, коли дані будуть змінені або подані. Ось як це виглядатиме у форматі a $watch, щоб дані завжди були доступні у вихідному, об'єднаному форматі:

$scope.$watch('chunkedData', function(val) {
  $scope.data = [].concat.apply([], val);
}, true); // deep watch

Багато людей вважають за краще це досягти у вигляді з фільтром. Це можливо, але його слід використовувати лише для відображення! Якщо ви додасте вхідні дані у цей відфільтрований вигляд, це спричинить проблеми, які можна вирішити, але вони не є гарними або надійними .

Проблема цього фільтра полягає в тому, що він щоразу повертає нові вкладені масиви. Кутовий переглядає повернене значення з фільтра. Перший раз, коли фільтр запускається, 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>

Спасибі за вашу допомогу. Але використання каруселі з ui-діаграмою в кутку не може намалювати графік bt каруселі працює добре. мій код - <carousel interval = "myInterval"> <slide ng-repeat = "віха в mileStone | split: 4" active = "slide.active"> <div class = "col-md-3" ng-repe = " milestone1 у віху "> <div style =" text-align: center; "> <div ui-chart =" data "chart-options =" ​​chartOptions "> </div> </div> </div> </ slide > </carousel> І я ініціалізував мій змінний діапазон як основні дані JSON.
куппу

1
@ m59 Зараз ця функція відображає дані в першому a b cдругому рядку d e f. Чи можу я відображати a b в першому стовпці c dдругому та e fтретьому стовпцях? Дякую

1
@ Ifch0o1 Ви б мали рацію, якби це було [].concat.call([], val). Ви повинні врахувати, що applyробить. val- це масив масивів, і ми хочемо передати кожен з цих масивів всередині нього як аргументи concat. Думаю, ви зосереджуєтесь на контексті [], що тут не суть справи. Те, що ми хочемо [].concat(val[1], val[2], val[3], etc), так нам і потрібноapply([], val)
m59

1
@bahadir Я оновив відповідь, щоб бути більш зрозумілою. Перевірте, що станеться, якщо ви зробите фільтр, який просто повертає []vs [[]]і [{}]. Вкладений масив / об'єкт змушує Angular бачити різний результат на кожному filter, і постійно повторює, шукаючи, щоб результат залишився колишнім (стабілізувався).
m59

1
Ви дійсно спамуєте коментарі :) Спробуйте самі. var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);Глибока перевірка означає або строфікацію та порівняння рядків, що є ризиковим, оскільки об'єкт не може бути строфіфікованим, або рекурсивно перевіряти кожну властивість окремо. Я думаю, що Angular міг би реалізувати це для фільтрів, але я впевнений, що є вагомі причини, що вони цього не зробили. Можливо, тому, що вони в основному призначені фільтри для простої модифікації набору даних, а не повного капітального ремонту зі змінами структури.
m59

64

Це рішення дуже просте:

JSON:

[{id:"1",name:"testA"},{id:"2",name:"test B"},{id:"3",name:"test C"},{id:"4",name:"test D"},{id:"5",name:"test E"}]

HTML:

<div ng-controller="MyCtrl">
  <table>
    <tr ng-repeat="item in items" ng-switch on="$index % 3">
      <td ng-switch-when="0">
        {{items[$index].id}} {{items[$index].name}}
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+1]">
          {{items[$index+1].id}} {{items[$index+1].name}}
        </span>
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+2]">    
          {{items[$index+2].id}} {{items[$index+2].name}}
        </span>
      </td>
    </tr>
  </table>
</div>

DEMO у FIDDLE

введіть тут опис зображення


3
Найкраща відповідь! І робіть те, що потрібно, з рідними директивами! Конграц!
Ренан Франка

1
Це рішення працює, але що стосується найкращих практик, ви, мабуть, не повинні використовувати таблиці для визначення макета у своїй розмітці :)
Дейв Купер

2
Як згадує @DaveCooper, ось альтернативний макет без таблиць: plnkr.co/edit/81oj8mHaNyfQpCmRBWO4?p=preview . Розглянемо таблиці для табличних даних, але в іншому випадку це краща компонування для мобільних пристроїв та змінних розмірів екрана.
Zymotik

1
Це, безумовно, найкраще рішення. Потрібен час, щоб знайти всі примхи при використанні нового фреймворку, але ng-перемикач - це знахідка
Зоран

Якщо ви збираєтесь ввести div замість таблиці, ви можете розмістити ng-switch-when="0"на зовнішньому діві один раз замість усіх трьох елементів.
Ганс Вутерс

19

Чисте, адаптоване рішення, яке не потребує обробки даних :

HTML:

<div class="control-group" class="label"
    ng-repeat="oneExt in configAddr.ext"
    ng-class="{'new-row': startNewRow($index, columnBreak) }">
    {{$index+1}}. 
    <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress{{$index}}" ng-model="oneExt.newValue" />
</div>

CSS:

.label {
    float: left;
    text-align: left;
}
.new-row {
    clear: left;
}

JavaScript:

$scope.columnBreak = 3; //Max number of colunms
$scope.startNewRow = function (index, count) {
    return ((index) % count) === 0;
};

Це просте рішення для динамічного відображення даних у рядки та стовпці без необхідності маніпулювати масивом даних, які ви намагаєтеся відображати. Крім того, якщо ви спробуєте змінити розмір вікна браузера, ви зможете побачити, що сітка динамічно адаптується до розміру екрана / діла.

(Я також додав до вашого ідентифікатора суфікс {{$ index}}, оскільки ng-повтор намагатиметься створити кілька елементів з тим самим ідентифікатором, якщо ви цього не зробите.)

Аналогічний робочий приклад


1
Я вважаю, що ОП захотіла розмітку рядків / стовпців Twitter Bootstrap, але це може бути корисним для когось. Однак у свою відповідь потрібно ввести код та пояснення. Відповіді видаляються лише за посиланням.
m59

@ m59 Оновлена ​​відповідь. Дякую за пропозицію
Cumulo Nimbus

1
Великий +1 для не потребує обробки даних . Це спрацювало ідеально для моїх потреб, щоб розділити дані в проміжку, використовуючи ng-повторення в 2 стовпці, щоб мій модаль Bootstrap був не таким довгим! Я був здивований, наскільки це просто здійснити! <span ng-repeat="z in waiverModalLinks" ng-class="{'new-row':startNewRow($index, columnBreak)}" class="{{z.id}}"><a href="{{z.link}}{{z.title}}">{{z.title}}</a></span>Це всередині `модального тіла '.
Christine268

15

Відповідь m59 досить хороша. Єдине, що мені не подобається в тому, що він використовує divs для того, що потенційно може бути даними для таблиці.

Отож у поєднанні з фільтром m59 (відповідь десь вище), ось як його відобразити в таблиці.

<table>
    <tr class="" ng-repeat="rows in foos | chunk:2">
        <td ng-repeat="item in rows">{{item}}</td>
    </tr>
</table>

7

Далі є більш простий спосіб:

<table>
    <tr ng-repeat="item in lists" ng-hide="$index%2!==0">
        <td>
            <label>{{ lists[$index].name}}</label>
        </td>
        <td ng-hide="!lists[$index+1]">
            <label>{{ lists[$index+1].name}}</label>
        </td>
    </tr>
</table>

Відповідь Cumulo Nimbus корисна для мене, але я хочу, щоб ця сітка була обгорнута дівом, який може показувати смугу прокрутки, коли список занадто довгий.

Для цього я додав style="height:200px; overflow:auto"розділ навколо столу, який змушує його відображатись як один стовпчик.

Тепер працює для масиву довжиною одиницю.


коли в масиві є лише 1 елемент, він не відображатиме сам перший рядок. щоб виправити цю зміну ng-hide="$index%2!==0"
Ануй Пандей

4

У мене є функція, і я зберігаю її в сервісі, щоб я міг її використовувати у всьому додатку:

Сервіс:

app.service('SplitArrayService', function () {
return {
    SplitArray: function (array, columns) {
        if (array.length <= columns) {
            return [array];
        };

        var rowsNum = Math.ceil(array.length / columns);

        var rowsArray = new Array(rowsNum);

        for (var i = 0; i < rowsNum; i++) {
            var columnsArray = new Array(columns);
            for (j = 0; j < columns; j++) {
                var index = i * columns + j;

                if (index < array.length) {
                    columnsArray[j] = array[index];
                } else {
                    break;
                }
            }
            rowsArray[i] = columnsArray;
        }
        return rowsArray;
    }
}

});

Контролер:

$scope.rows   = SplitArrayService.SplitArray($scope.images, 3); //im splitting an array of images into 3 columns

Розмітка:

 <div class="col-sm-12" ng-repeat="row in imageRows">
     <div class="col-sm-4" ng-repeat="image in row">
         <img class="img-responsive" ng-src="{{image.src}}">
     </div>
 </div>

Хоча це круто, це не допомагає при використанні інших фільтрів, таких як orderBy або filter.
Роббі Сміт

2

Мій підхід був сумішшю речей.

Моя мета полягала в тому, щоб сітка адаптувалася до розміру екрана. Я хотів 3 стовпчики для lg, 2 стовпці для smі mdта 1 стовпчик дляxs .

По-перше, я створив таку функцію масштабування, використовуючи кутовий $windowсервіс:

$scope.findColNumberPerRow = function() {
    var nCols;
    var width = $window.innerWidth;

    if (width < 768) {
        // xs
        nCols = 1;
    }
    else if(width >= 768 && width < 1200) {
         // sm and md
         nCols = 2
    } else if (width >= 1200) {
        // lg
        nCols = 3;
    }
    return nCols;
};

Потім я використав клас, запропонований @Cumulo Nimbus:

.new-row {
    clear: left;
}

У розділ, що містить ng-repeat, я додав resizableдирективу, як пояснено на цій сторінці , так що кожного разу, коли змінюється вікно, кутове $windowобслуговування оновлюється новими значеннями.

Зрештою, у повторному діві я маю:

ng-repeat="user in users" ng-class="{'new-row': ($index % findColNumberPerRow() === 0) }"

Будь ласка, дайте мені знати будь-які недоліки у цьому підході.

Сподіваюся, це може бути корисним.


2

Простий трюк з CSS "clearfix", рекомендований Bootstrap:

<div class="row">
      <div ng-repeat-start="value in values" class="col-md-4">
        {{value}}
      </div>
      <div ng-repeat-end ng-if="$index % 3 == 0" class="clearfix"></div>
</div>

Багато переваг: Ефективне, швидке використання рекомендацій Boostrap, уникнення можливих проблем із дайджестом $ та не змінення кутової моделі.


1

Цей приклад створює вкладений ретранслятор, де зовнішні дані містять внутрішній масив, який я хотів перерахувати у двох стовпцях. Ця концепція відповідає дійсності для трьох або більше стовпців.

У внутрішньому стовпчику я повторюю "рядок" до досягнення межі. Ліміт визначається діленням довжини масиву елементів на кількість бажаних стовпців, в даному випадку на два. Метод поділу сидить на контролері і передається поточна довжина масиву як параметр. Потім функція JavaScript фрагмент (0, array.length / columnCount) потім застосувала обмеження до ретранслятора.

Потім повторюється повторювач другого стовпця і повторює фрагмент (array.length / columnCount, array.length), який видає другу половину масиву у другому стовпці.

<div class="row" ng-repeat="GroupAccess in UsersController.SelectedUser.Access" ng-class="{even: $even, odd: $odd}">
    <div class="col-md-12 col-xs-12" style=" padding-left:15px;">
        <label style="margin-bottom:2px;"><input type="checkbox" ng-model="GroupAccess.isset" />{{GroupAccess.groupname}}</label>
    </div>
    <div class="row" style=" padding-left:15px;">
        <div class="col-md-1 col-xs-0"></div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice(0, state.DivideBy2(GroupAccess.features.length))">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice( state.DivideBy2(GroupAccess.features.length), GroupAccess.features.length )">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-5 col-xs-8">
        </div>
    </div>
</div>


// called to format two columns
state.DivideBy2 = function(nValue) {
    return Math.ceil(nValue /2);
};

Сподіваюсь, це допоможе переглянути рішення ще по-іншому. (PS це моя перша публікація тут! :-))


1

Виправляю без .row

<div class="col col-33 left" ng-repeat="photo in photos">
   Content here...
</div>

і css

.left {
  float: left;
}

1

Ось простий легкий спосіб зробити це. Це більше вручну і закінчується безладною розміткою. Я не рекомендую цього, але є ситуації, коли це може бути корисним.

Ось скрипковий посилання http://jsfiddle.net/m0nk3y/9wcbpydq/

HTML:

<div ng-controller="myController">
    <div class="row">
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)*2">
                {{ person.name }}
                </div>
            </div>
        </div>
    </div>
</div>

JS:

var app = angular.module('myApp', []);

app.controller('myController', function($scope) {

    $scope.Math = Math;
    $scope.data = [
        {"name":"Person A"},
        ...
    ];
});

Цей параметр вимагає від нас використовувати деяку математику для розмітки: /, тому вам потрібно буде ввести Math, додавши цей рядок: $scope.Math = Math;


1

Усі ці відповіді виглядають масово задуманими.

На сьогодні найпростішим методом було б встановити вхідні знаки в завантажувальному стовпчику col-md-4, тоді bootstrap автоматично відформатує його в 3 стовпці завдяки 12-стовпецькому характеру завантажувальної програми:

<div class="col-md-12">
    <div class="control-group" ng-repeat="oneExt in configAddr.ext">
        <div class="col-md-4">
            <input type="text" name="macAdr{{$index}}"
                   id="macAddress" ng-model="oneExt.newValue" value="" />
        </div>
    </div>
</div>

1
<div class="row">
  <div class="col-md-4" ng-repeat="remainder in [0,1,2]">
    <ul>
      <li ng-repeat="item in items" ng-if="$index % 3 == remainder">{{item}}</li>
    </ul>
  </div>
</div>

0

Відмови від дуже доброї відповіді m59. Я виявив, що введення моделі буде розмитим, якщо вони змінюються, тож ви можете змінювати лише один символ за один раз. Це новий список списків об'єктів для тих, хто цього потребує:

EDIT Оновлено для обробки декількох фільтрів на одній сторінці

app.filter('partition', function() {
  var cache = {}; // holds old arrays for difference repeat scopes
  var filter = function(newArr, size, scope) {
    var i,
      oldLength = 0,
      newLength = 0,
      arr = [],
      id = scope.$id,
      currentArr = cache[id];
    if (!newArr) return;

    if (currentArr) {
      for (i = 0; i < currentArr.length; i++) {
        oldLength += currentArr[i].length;
      }
    }
    if (newArr.length == oldLength) {
      return currentArr; // so we keep the old object and prevent rebuild (it blurs inputs)
    } else {
      for (i = 0; i < newArr.length; i += size) {
        arr.push(newArr.slice(i, i + size));
      }
      cache[id] = arr;
      return arr;
    }
  };
  return filter;
}); 

І це буде використання:

<div ng-repeat="row in items | partition:3:this">
  <span class="span4">
    {{ $index }}
  </span>
</div>

Наскільки я можу сказати, це повинно працювати більшу частину часу, але ця логіка кешування не виглядає цілком надійною, і проходження в області є незручним. Я дуже рекомендую просто фільтрувати всередині контролера, коли потрібні входи. Це все одно технічно правильний підхід.
m59

0

Я новачок у bootstrap та angularjs, але це також може зробити масив на 4 елементи як одна група, результат буде майже як 3 стовпчики. Цей трюк використовує принцип розриву завантажувальної програми.

<div class="row">
 <div class="col-sm-4" data-ng-repeat="item in items">
  <div class="some-special-class">
   {{item.XX}}
  </div>
 </div>
</div>

0

У Лодаша є вбудований метод, який я особисто використовую: https://lodash.com/docs#chunk

На підставі цього код контролера може виглядати наступним чином:

$scope.groupedUsers = _.chunk( $scope.users, 3 )

Переглянути код:

<div class="row" ng-repeat="rows in groupedUsers">
  <div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>

0

Інший спосіб встановлений width:33.33%; float:leftна оболонку, подібна на цей:

<div ng-repeat="right in rights" style="width: 33.33%;float: left;">
    <span style="width:60px;display:inline-block;text-align:right">{{$index}}</span>
    <input type="number" style="width:50px;display:inline-block" ">
</div>

0

Я опинився в подібному випадку, бажаючи генерувати групи відображення по 3 стовпчики кожна. Однак, хоча я використовував завантажувальний інструмент, я намагався розділити ці групи на різні батьківські діви. Я також хотів зробити щось загально корисне.

Я підійшов до нього з 2, ng-repeatяк показано нижче:

<div ng-repeat="items in quotes" ng-if="!($index % 3)">
  <div ng-repeat="quote in quotes" ng-if="$index <= $parent.$index + 2 && $index >= $parent.$index">
                ... some content ...
  </div>
</div>

Це дозволяє дуже легко змінити на іншу кількість стовпців і розділити їх на кілька батьківських знаків.


0

На випадок, якщо хтось хоче Angular 7 (і вище версії) ось приклад, який я використав в одному зі своїх додатків:

HTML:

                   <div class="container-fluid">
                    <div class="row" *ngFor="let reports of chunkData; index as i">
                        <div *ngFor="let report of reports" class="col-4 col-sm-4"
                            style="border-style:solid;background-color: antiquewhite">{{report}}</div>
                    </div>
                </div>

.TS FILE

export class ConfirmationPageComponent implements OnInit {
  chunkData = [];
  reportsArray = ["item 1", "item 2", "item 3", "item 4", "item 5", "item 6"];
  
  constructor() {}

  ngOnInit() {
    this.chunkData = this.chunk(this.reportsArray, 3);
  }

  chunk(arr, size) {
    var newArr = [];
    for (var i = 0; i < arr.length; i += size) {
      newArr.push(arr.slice(i, i + size));
    }
    return newArr;
  }
}

Це дивовижне рішення для динамічного створення нових стовпців / рядків залежно від кількості елементів, які ви повторюєте з бази даних. Дякую!


-1

це відповідає на початкове запитання - як отримати 1,2,3 у стовпці. - запитав kuppu 8 лютого 14 о 13:47

код angularjs:

function GetStaffForFloor(floor) {
    var promiseGet = Directory_Service.getAllStaff(floor);
    promiseGet.then(function (pl) {
        $scope.staffList = chunk(pl.data, 3); //pl.data; //
    },
    function (errorOD) {
        $log.error('Errored while getting staff list.', errorOD);
    });
}
function chunk(array, columns) {
    var numberOfRows = Math.ceil(array.length / columns);

    //puts 1, 2, 3 into column
    var newRow = []; //array is row-based.
    for (var i = 0; i < array.length; i++) {
        var columnData = new Array(columns);
        if (i == numberOfRows) break;
        for (j = 0; j < columns; j++)
        {
            columnData[j] = array[i + numberOfRows * j];
        }
        newRow.push(columnData); 
    }
    return newRow;

    ////this works but 1, 2, 3 is in row
    //var newRow = [];
    //for (var i = 0; i < array.length; i += columns) {
    //    newRow.push(array.slice(i, i + columns)); //push effectively does the pivot. array is row-based.
    //}
    //return newRow;
};

Переглянути код (примітка: за допомогою завантажувального пристрою 3):

<div class="staffContainer">
    <div class="row" ng-repeat="staff in staffList">
        <div class="col-md-4" ng-repeat="item in staff">{{item.FullName.length > 0 ? item.FullName + ": Rm " + item.RoomNumber : ""}}</div>
    </div>
</div>

-1

Цей код допоможе вирівняти елементи з трьома стовпцями в режимі lg та md, двома колонками в режимі sm, а один стовпець - xs mode

<div class="row">
<div ng-repeat="oneExt in configAddr.ext">
    <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4">
        {$index+1}}. 
        <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress" ng-model="oneExt.newValue" value=""/>
    </div>
</div>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.