KnockoutJS синтаксис прив'язки без контейнерів
Будь ласка, витримайте зі мною секунду: KnockoutJS пропонує надзвичайно зручний варіант використання синтаксису прив'язки без контейнерів для його foreachприв'язки, як обговорюється в Примітці 4 до foreachдокументації щодо прив'язки.
http://knockoutjs.com/documentation/foreach-binding.html
Як ілюструє приклад документації Knockout, ви можете написати своє прив'язку в KnockoutJS так:
<ul>
<li class="header">Header item</li>
<!-- ko foreach: myItems -->
<li>Item <span data-bind="text: $data"></span></li>
<!-- /ko -->
</ul>
Я думаю, що досить прикро, що AngularJS не пропонує такий тип синтаксису.
Кутові ng-repeat-startтаng-repeat-end
У AngularJS для вирішення ng-repeatпроблем, зразки, з якими я стикаюся, мають тип jmagnusson, розміщений у його (корисній) відповіді.
<li ng-repeat-start="page in [1,2,3,4,5]"><a href="#">{{page}}</a></li>
<li ng-repeat-end></li>
Моя початкова думка, побачивши цей синтаксис, така: справді? Чому Angular змушує всю цю додаткову розмітку, з якою я не хочу нічого робити, і це набагато простіше в Knockout? Але потім коментар hitautodestruct у відповіді jmagnusson почав змушувати мене задуматися: що генерується за допомогою ng-repeat-start та ng-repeat-end для окремих тегів?
Чистіший спосіб використання ng-repeat-startтаng-repeat-end
Досліджуючи твердження hitautodestruct, додавання ng-repeat-endдо окремого тегу - це саме те, що я б не хотів робити в більшості випадків, оскільки він генерує абсолютно марні елементи: у цьому випадку <li>елементи, в яких нічого немає. Пагінований список Bootstrap 3 стилізує елементи списку таким чином, що здається, що ви не створили зайвих елементів, але коли ви перевіряєте створений html, вони там є.
На щастя , вам не потрібно багато робити, щоб мати більш чисте рішення та меншу кількість html: просто розмістіть ng-repeat-endдекларацію на тому самому тегу html, який маєng-repeat-start .
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat-start="page in [1,2,3,4,5]" ng-repeat-end><a href="#"></a></li>
<li>
<a href="#">»</a>
</li>
</ul>
Це дає 3 переваги:
- менше HTML тегів для написання
- марні, порожні теги не створюються Angular
- коли масив для повторення порожній, тег з
ng-repeatне генерується, що дає вам ту саму перевагу Безконтактне прив'язування Knockout дає вам у зв'язку з цим
Але є все-таки чистіший спосіб
Після подальшого перегляду коментарів у github щодо цього питання для Angular, https://github.com/angular/angular.js/issues/1891 ,
вам не потрібно використовувати ng-repeat-startта ng-repeat-endдосягати тих самих переваг. Натомість, знову розгалуживши приклад jmagnusson, ми можемо просто перейти:
<ul class="pagination">
<li>
<a href="#">«</a>
</li>
<li ng-repeat="page in [1,2,3,4,5,6]"><a href="#">{{page}}</a></li>
<li>
<a href="#">»</a>
</li>
</ul>
То коли використовувати ng-repeat-startі ng-repeat-end? Відповідно до кутової документації , до
... повторити серію елементів замість лише одного батьківського елемента ...
Досить розмов, покажіть кілька прикладів!
Досить справедливо; цей jsbin описує п’ять прикладів того, що відбувається, коли ви робите і коли ви не використовуєте один і ng-repeat-endтой же тег.