Angular.js: ngRepeat с DL / DD / DT

Созданный на 26 янв. 2013  ·  76Комментарии  ·  Источник: angular/angular.js

Есть ли временные рамки, когда (и как?) NgRepeat будет обрабатывать списки определений?

Если вы не знакомы с проблемой: в настоящее время ngRepeat работает с отдельными элементами. Для большинства HTML это работает нормально ... однако для списков определений, таких как <dl> , это не работает. Почему? Поскольку списки определений используют несколько элементов для определения одного элемента списка.

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

Есть идеи, когда будет реализована эта функция? Или если есть несколько стабильная ветка, которую можно объединить для решения этой проблемы? Существующие решения в настоящее время _очень_ взломаны, противоречат стандартам и склонны к взлому кода в IE и т. Д.

Мысли?

edit : Под «стабильной веткой, которая может быть объединена» я имел в виду ветку, которую я мог бы запустить на своем сайте и решить эту проблему до тех пор, пока код не будет официально объединен. Мои извинения за плохую формулировку :)

$compile feature

Самый полезный комментарий

да. У нас есть решение, которое только что появилось: e46100f7097d9a8f174bdb9e15d4c6098395c3f2

Закрываю этот вопрос.

Все 76 Комментарий

второе это. У меня была эта проблема некоторое время.

@IgorMinar проделал некоторую работу над ng-repeat на основе комментариев (https://github.com/angular/angular.js/pull/1646), но поскольку комментарии не воспроизводятся так хорошо во всех браузерах, это вряд ли будет слились. Вместо этого они ищут альтернативное решение, возможно, с «начальным и конечным повторением тегов» или «начало-повторение и количество элементов для повторения метки».

Как насчет того, чтобы разрешить шаблоны внутри пар, например {{}}

может быть:
{{! ng-repeat = "фу в л"

фу

{{l}}

!}}

В связи с этим у меня есть аналогичная проблема: возникнут ли большие технические проблемы со второй формой интерполяции
например {{{}}}, которые не экранировали символы HTML, но также не создавали
новый промежуток?

Во вторник, 29 января 2013 г., 12:38, Пит Бэкон Дарвин <
[email protected]> написал:

@IgorMinar https://github.com/IgorMinar поработал над
ng-repeat на основе комментариев (# 1646https: //github.com/angular/angular.js/issues/1646)
но поскольку комментарии не воспроизводятся так хорошо во всех браузерах, вряд ли
быть объединенным. Вместо этого они ищут альтернативное решение, возможно
либо с "начальным и конечным тегами повтора", либо с "начальным повторением и количеством
элементы для повторения метки "

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -12856484.

Я только что столкнулся с этой проблемой с таблицей, которая хочет сгенерировать два элемента «td» для каждого объекта в массиве.

+1 за добавление этой функции. Просто столкнулся с этим же ограничением.

:пальцы вверх:

Здесь та же проблема. Я бы хотел увидеть что-то вроде «ng-repeat-children», повторяющего только дочерние элементы, но не текущий элемент, или своего рода «ng-omit-tag» (который удаляет текущий тег, но оставляет дочерние элементы на месте), которые будут использоваться вместе с ng-repeat. Это позволит избежать создания тонны недопустимой разметки для решения этой проблемы.

Не совсем понимаете обсуждаемое ограничение. Почему установка ng-repeat на родительский элемент работает? http://jsfiddle.net/JyWdT/13/
Может ли кто-нибудь создать скрипку, которая более подробно объясняет проблему?

lgalfaso, Ваша скрипка создает несколько списков определений, каждый с одним определением. Желаемый результат - один список определений с несколькими определениями.

Или в моем случае мне нужно создать пару элементов «td» для каждого элемента в массиве.
Скажем, у меня есть массив,

[{name:dan, age:15}, {name:steve, age:21}]

и мне нужно вывести:

<tr><td>dan</td><td>15</td><td>steve</td><td>21</td></tr>

В настоящее время это невозможно сделать с помощью angular.

не можете ли вы сделать это, поместив ng-repeat в элемент tr?

http://plnkr.co/edit/lJvkOpz0NnKWcfEeM4lE?p=preview

21 апреля 2013 г. в 14:24 zilles [email protected] написал:

lgalfaso, ваша скрипка создает несколько списков определений, каждый с одним
определение. Желаемый результат - один список определений с несколькими
определения.

Или в моем случае мне нужно создать пару элементов "td" для каждого элемента в
массив.
Скажем, у меня есть массив,

[{ name: dan , age: 15 }, { name: steve , age: 21 }]

и мне нужно вывести:

дан15Стив21 год

В настоящее время это невозможно сделать с помощью angular.

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -16716788
.

О, понятно, не обращайте внимания на мой предыдущий комментарий
21 апреля 2013 г., 9:09, «джейсон турим» джейсон. [email protected] написал:

не можете ли вы сделать это, поместив ng-repeat в элемент tr?

http://plnkr.co/edit/lJvkOpz0NnKWcfEeM4lE?p=preview

21 апреля 2013 г. в 14:24 zilles [email protected] написал:

lgalfaso, ваша скрипка создает несколько списков определений, каждый с одним
определение. Желаемый результат - один список определений с несколькими
определения.

Или в моем случае мне нужно создать пару элементов "td" для каждого элемента в
массив.
Скажем, у меня есть массив,

[{ name: dan , age: 15 }, { name: steve , age: 21 }]

и мне нужно вывести:

дан15Стив21 год

В настоящее время это невозможно сделать с помощью angular.

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -16716788
.

Поскольку я только что столкнулся с проблемой dl / dt + dd, я подтверждаю, что новая обязательная директива ng-repeat-children (или ng-repeat-inner) отсутствует.

+1

Предложение по новой директиве ng-repeat-inner. Если с этим предложением все в порядке, то внесу изменения во все руководства.

Я думаю, что было бы лучше использовать ту же директиву ng-repeat , но разрешить использование этой директивы в комментариях HTML, как предлагает исходный пост.

Что-то вроде этого должно работать:

<dl>
  <!-- ng-repeat="(name, definition) in myList" -->
  <dt>{{name}}</dt>
  <dd>{{definition}}</dd>
  <!-- /ng-repeat -->
</dl>

Не уверен, как точно будут достигаться начало и конец повторяющегося блока ( <!-- /ng-repeat --> было предложено @ProLoser), но я думаю, что использование комментариев HTML было бы элегантным решением.

Учитывая, что минификаторы могут убивать комментарии и другие проблемы с комментариями, я
не думаю, что это здорово. Однако мне нравится идея использовать ng-repeat.
возможно ли включить атрибут ng-repeat-single-root или
что-то, что при значении true будет запускать ng-repeat без корня
элемент? Например:

{я}
{я}

станет:

1
1
2
2
3
3

Во вторник, 23 апреля 2013 г., в 15:54, Mani Tadayon [email protected] написал:

Я думаю, что было бы лучше использовать ту же директиву ng-repeat, но разрешить
чтобы эта директива использовалась в комментариях HTML в качестве исходного сообщения
предлагает.

Что-то вроде этого должно работать:

{{имя}}
{{определение}}

Не уверен, как именно повторять начало и конец блока
будет достигнуто (я придумалв моем примере),
но я думаю, что использование HTML-комментариев было бы элегантным решением.

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -16891970
.

maxcan, я вижу преимущества "single-root", поскольку вы сохраняете исходный html действительным, но эта конструкция не позволяет вам добавлять что-либо еще внутри тега "dl" ... Фиксированное определение, например, которое вы хотите включить перед вашим циклом динамических определений. Решение lgalfaso справится с этим.

@maxcan без большой переделки или

Мне нравится предложение @bowsersenior , но я бы предпочел это в качестве заключительного комментария: <!-- /ng-repeat -->

Это позор для производительности. В любом случае, я полностью поддерживаю
Решение @lgalfaso , предполагая, что вы можете поместить директиву в div, а не
просто комментарий ..

В среду, 24 апреля 2013 г., в 13:58 Дин Софер [email protected] написал:

Мне нравится предложение @bowsersenior https://github.com/bowsersenior , но
Я бы предпочел это в качестве заключительного комментария:

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -16964155
.

Я согласен с @ProLoser в том, что <!-- /ng-repeat --> - лучший закрывающий тег в подходе к комментариям HTML. Одно замечание: angular позволяет определять директивы в комментариях HTML, поэтому я не думаю, что комментарии HTML можно отбросить как потенциальное решение этой проблемы. Имейте в виду, что основные разработчики angular указали, что они планируют использовать комментарии HTML для решения этой проблемы в этом вопросе о переполнении стека (как указано на исходном плакате):

Я не против отказаться от них, если есть способ сделать это без
Комментарии.

В среду, 24 апреля 2013 г., в 14:41, Мани Тадайон [email protected] написал:

Я согласен с @ProLoser https://github.com/ProLoser, что - лучший закрывающий тег в подходе к HTML-комментариям. Один
обратите внимание, angular позволяет определять директивы в комментариях HTML, поэтому я не
думаю, что комментарии HTML могут быть отброшены как потенциальное решение для этого
проблема. Имейте в виду, что основные разработчики angular указали, что они
планируется использовать комментарии HTML для решения этой проблемы в этом переполнении стека
вопрос (как указано на оригинальном плакате):

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -16969268
.

+1 к ng-repeat-inner @lgalfaso . Я, наконец, хотел бы что-то, что просто делает это.

Knockout делает это с комментариями. Я пытаюсь перенести что-то, что я сделал с тегом dl в knockout, и кажется, что это невозможно, пока эта проблема не будет решена.

Это мое мнение, поэтому без ввода от @mhevery или @IgorMinar отнеситесь к этому с недоверием.
Я действительно вижу, что создание ng-repeat с комментариями более гибкое, во всяком случае, это не выглядит естественным без изменения $ compiler, чтобы он мог обрабатывать директиву типа «между комментариями». Причина в том, что это выглядит странно, что директива должна заботиться о вложении и смотреть за пределы элемента, который ей дан, чтобы делать то, что предполагается.

Если комментарии / отсутствие комментариев являются причиной продолжающихся споров, не можем ли мы просто взять их оба? Мне трудно понять, что такая распространенная проблема не решалась более 3 месяцев. Если причина этого в основном связана с разногласиями по поводу реализации, кажется более предпочтительным иметь что-то на самом деле реализованное (и, возможно, обновленное / добавленное в будущем), чем ждать дольше ничего для чего-то более «оптимального».

Однако в большинстве случаев мне кажется, что если ng-repeat-inner относится к повторению набора элементов «внутри» определенного чего-то, это означает, что в большинстве случаев вы уже создали какой-то эксклюзивный внешний контейнер. Следовательно, хотя реализация комментариев может быть более универсальной (хотя, возможно, это дополнительные 1/2 строки кода, которых я бы хотел избежать, если это вообще возможно), я считаю, что он может использоваться меньше (и, возможно, должен иметь меньший приоритет), чем внутриэлементная директива.

Вопрос о том, следует ли использовать комментарии HTML, не имеет никакого отношения к тому факту, что этот вопрос не решен в течение нескольких месяцев. Я думаю, что все, что нужно, - это немного внимания со стороны разработчиков angular, чтобы решить проблему и реализовать решение.

Если вы его пропустили, см. Здесь https://github.com/angular/angular.js/pull/1646 о проблемах с репитерами на основе комментариев. Решение @lgalfaso на данный момент намного более перспективно.

Спасибо, что указали на # 1646. В этом обсуждении есть комментарий @mhevery, который предлагает «лучший способ сделать это» без отображения кода (возможно, это ошибка форматирования):

Хотелось бы, чтобы мы знали, что это за «лучший способ»!

В основной команде пришли к единому мнению, что в настоящее время лучший способ решения этой проблемы - один из следующих (мы еще не остановились на синтаксисе, но реализация почти одинакова для всех из них):

все эти примеры содержат два td , я сделал это специально, хотя это незаконно, потому что я хотел показать, что повторитель должен позволять повторять произвольное количество элементов - было бы лучше преобразовать эти примеры для использования таблицы и строки таблицы, но сейчас я собираюсь отключиться, и у меня нет времени на их рефакторинг.

Синтаксис A:

<dl>
  <dt ng-repeat="(name, definition) in myList">{{name}}</dt>
  <dd ng-repeat-next>{{definition}}</dd>
  <dd ng-repeat-next>{{definition}}</dd>
</dl>

Синтаксис B:

<dl>
  <dt ng-repeat-start="(name, definition) in myList">{{name}}</dt>
  <dd>{{definition}}</dd>
  <dd ng-repeat-end>{{definition}}</dd>
</dl>

Синтаксис C:

<dl>
  <dt ng-repeat="(name, definition) in myList" ng-repeat-start>{{name}}</dt>
  <dd>{{definition}}</dd>
  <dd ng-repeat-end>{{definition}}</dd>
</dl>

Синтаксис D:

<dl>
  <dt ng-repeat="(name, definition) in myList" ng-repeat-group>{{name}}</dt>
  <dd ng-repeat-group>{{definition}}</dd>
  <dd ng-repeat-group>{{definition}}</dd>
</dl>

В долгосрочной перспективе, когда у нас будет лучшая поддержка браузеров, мы начнем использовать новый элемент <template> который позволит нам сделать это просто:

Синтаксис X:

<template>
  <dl>
    <ng repeat="(name, definition) in myList">
      <dt>{{name}}</dt>
      <dd>{{definition}}</dd>
      <dd>{{definition}}</dd>
    </ng>
  </dl>
</template>

если кто-то захочет создать PR для этого решения, он будет объединен. Также, если вы предпочитаете какой-то конкретный синтаксис, сообщите об этом.

Спасибо за вклад. С моей точки зрения, синтаксис A непонятен для вложенных циклов, подобных следующему

<dl>
  <dt ng-repeat="...">loop 1</dt>
  <dt ng-repeat="..." ng-repeat-next>loop 2</dt>
  <dd ng-repeat-next>is this within loop 2 or only loop 1</dd>
</dl>

Синтаксис B и C примерно одинаковы, мне нравятся обе альтернативы (даже когда я думаю, что синтаксис B в чем-то лучше)

Если мне чего-то не хватает, синтаксис D имеет те же проблемы с вложенными циклами, что и синтаксис A.

Я бы выбрал B, если возможно, просто потому, что мне нужно было писать как можно меньше букв. Он также выглядит наиболее симметричным - мне кажется, им проще всего управлять из-за визуальной симметрии.

Комментарий Игалфасоса указывает на интересную дилемму. Что, если вложенный цикл в его примере находится на первом элементе, а не на втором. Тогда все версии синтаксиса теперь неясны, если я что-то не упускаю.

Я не совсем понимаю разницу между предложенным @lgalfaso ng-repeat-inner и ng repeat в Syntax X, хотя и оберткой <template> . Может кто-нибудь объяснить?

Я тоже не уверен, что понимаю это, но я предполагаю, что тег <ng> не становится частью DOM, что позволяет избежать незаконной структуры вложенности в dl .

Что касается предложенных синтаксисов, я бы проголосовал за Б.

Я считаю, что синтаксис X case позволяет использовать общий фиктивный элемент оболочки <ng> который не является частью DOM и может содержать различные директивы. Это более общий характер, чем ng-repeat-inner , который применяется только к конкретному варианту использования для ng-repeat .

Если синтаксис X, долгосрочная цель, является просто более общей версией ng-repeat-inner , я считаю, что ng-repeat-inner также следует (* не только) принять в соответствии с одним из предложенных A, B, C, D для следующего:

  1. оба синтаксиса X и ng-repeat-inner имеют одинаковую структуру dom
    : если синтаксис X является долгосрочной целью, было бы неплохо иметь что-то, что структурно согласуется с ним аналогичным образом, чтобы предотвратить будущий рефакторинг.
  2. в большинстве случаев ng-repeat-inner все равно будет достаточно
    : цель состоит в том, чтобы создать внешний контейнер для повторения внутренних элементов.

@ daegon123 разница между любым из перечисленных синтаксисов @IgorMinar «s (включая X) и ng-repeat-inner является то , что Синтаксисы позволяют произвольно повторять набор элементов без отдельного контейнера. Например, повторите набор <tr> s, пока есть другие неповторяющиеся <tr> s в table или tbody . В этом случае повторяющиеся элементы не имеют отдельного родителя, к которому можно привязать ng-repeat-inner .

<table>
    <thead>...</thead>
    <tr ng-repeat-start="(name, definition) in myList">...</tr>
    <tr>...</tr>
    <tr ng-repeat-end>...</tr>
    <tr>...</tr>
    <tfoot>...</tfoot>
</table>

Или несколько определений для каждого объекта в <dl>

<dl>
    <dt ng-repeat-start="...">{{item.term1}}</dt>
    <dd>{{item.def1}}</dd>
    <dt>{{item.term2}}</dt>
    <dd>{{item.def2}}</dd>
    <dt>{{item.term3}}</dt>
    <dd ng-repeat-end>{{item.def3}}</dd>
</dl>

@ es128 Спасибо за комментарии и код. Именно по этой причине я предложил принять ng-repeat-inner «вместе» с одним из других перечисленных синтаксисов, но вид реального кода в ваших комментариях заставляет меня задуматься, нужен ли вообще ng-repeat-inner . Я отправлю еще один комментарий, если что-то наткнусь - еще раз спасибо!

Проблема с ng-repeat-inner заключается в том, что его нельзя использовать во всех случаях, например:

<ul>
  <li>some static prefix item</li>
  <!-- repeat these nodes -->
    <li>{{ something }}</li>
    <li>{{ something else }}</li>
  <!-- repeat end -->
  <li>some static postfix item</li>
</ul>

поскольку вы не можете поместить искусственный элемент (например, div) в ul (согласно спецификации html), здесь нельзя использовать ng-repeat-inner.

кстати с элементом шаблона, мы сможем поместить искусственный элемент между ul и li.

Также не слишком привязывайтесь к синтаксису X, это был просто быстрый и грязный пример того, что мы в конечном итоге сможем сделать, точный синтаксис еще предстоит обсудить, но пока я занимаюсь этим, вот еще один один:

Синтаксис Y:

<ul>
  <li>some static prefix item</li>
  <template repeat="item in items">
    <li>{{ item.name }}</li>
    <li>{{ item.owner }}</li>
  </template>
  <li>some static postfix item</li>
</ul>

Как насчет установки идентификатора для группы ng-repeat?
Тогда мы могли свободно прикреплять к нему предметы с любого уровня. Что-то вроде

<dl>
    <dt ng-repeat="item in items" ng-repeat-group="someId">{{item.term}}</dt>
    <dd ng-repeat-with="someId">{{item.definition}}</dd>
</dl>

может обеспечить необходимую нам гибкость.

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

Отличная работа, Лукас! Я провел вечер, пытаясь реализовать синтаксис C. Он работает правильно, но вложение не поддерживается из-за включения, превращающего все ng-repeat в комментарии.

Если я не могу пересечь DOM в поисках ng-repeat-start , я не могу вычислить глубину атрибута ng-repeat-end для сопоставления. Кажется, ваш подход решает проблему ...

Хммм ... что-то не так. В вашем коммите отсутствуют документы, поэтому, возможно, я использую неправильный синтаксис.

Взгляните на это:
http://plnkr.co/edit/sVilxKaNrhNM4JrkuQ5r?p=preview

Я ожидал, что вывод для невложенного случая будет:

Term: elastic
     Static term
     This definition should be repeated for every term: 'elastic' term
Term: par
     Static term
     This definition should be repeated for every term: 'par' term

А для вложенного:

Term: elastic
     Static term
Subterm: superelastic
     Static subterm
     This should be repeater for every subterm: 'super' subterm from 'elastic' term
Subterm: subelastic
     Static subterm
     This should be repeater for every subterm: 'sub' subterm from 'elastic' term
     This definition should be repeated for every term: 'elastic' term
Term: par
     Static term
Subterm: superpar
     Static subterm
     This should be repeater for every subterm: 'super' subterm from 'par' term
Subterm: subpar
     Static subterm
     This should be repeater for every subterm: 'sub' subterm from 'par' term
     This definition should be repeated for every term: 'par' term

Я что-то упускаю?

@lrlopez В приведенном вами примере не используется последняя версия кода. Кроме того, в строке 23 есть лишний </dl>

Спасибо за быстрый ответ! Вы правы, в строке 23 было лишнее </dl> . Я также обновил библиотеку. Тем не менее, я все еще не могу заставить работать вложенный пример ...

Хорошо, похоже, что это реальная проблема с многоэлементными директивами, которые находятся на одном уровне в DOM. Обновлен PR с исправлением этой проблемы

Такие исправления, как ng-repeat-inner или ng-repeat-next, решают только одну из бесчисленных ситуаций, когда поведение привязки к реальным узлам DOM будет ограничивать вас.

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

Идея использования комментариев аналогична, но это приводит к некрасивому, трудночитаемому коду, и вам по-прежнему нужен способ назвать этот узел и как-то закрыть его. Вместо того, чтобы изобретать новый синтаксис узла комментариев, используйте существующий синтаксис HTML.

Подумайте об этом как о концепции, подобной, скажем, тихим классам SASS:

<div id="myComplexList">
    <ng-virtual ng-repeat="...">
        <a></a>
        <b></b>
        <c></c>
    </ng-virtual>
</div>

Result:

<div id="myComplexList">
    <a></a>
    <b></b>
    <c></c>
    <a></a>
    <b></b>
    <c></c>
    <a></a>
    <b></b>
    <c></c>
    ...
</div>

+1 к общей идее, но я бы выбрал что-то вроде ng-repeat-group.

<ng-repeat-group="b in ches">
// group markup to be repeated here
</ng-repeat-group>

Мне нравится идея виртуальных узлов, но я против того, чтобы она стала общим решением проблемы.

Если возможно, я бы хотел ограничить создание любых искусственных контейнеров. Хотя контейнер может не отображаться в HTML-коде общего результата, он начнет загромождать HTML-код, которым нужно управлять.

Во многих случаях нам понадобится какой-то контейнер для хранения того, что мы хотим повторить. бывший:

<tr>
  <td ng-repeat-start>1</td>
  <td ng-repeat-end>2</td>
</tr>

(контейнер здесь - [tr] s)

использование предложенного решения виртуального узла превратит это в:

<tr>
  <ng-virtual ng-repeat="...">
     <td>1</td>
     <td>2</td>
  </ng-virtual>
</tr>

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

Другая проблема заключается в том, что он начнет утомлять попытки понять, на каком уровне dom находится код в настоящее время.
Вот небольшой код из @ es128

<table>
<thead>...</thead>
    <tr ng-repeat-start="(name, definition) in myList">...</tr>
    <tr>...</tr>
    <tr ng-repeat-end>...</tr>
    <tr>...</tr>
    <tfoot>...</tfoot>
</table>

использование виртуальных узлов превращает это в:

<table>
<thead>...</thead>
    <ng-virtual ng-repeat="...">
        <tr">...</tr>
        <tr>...</tr>
        <tr>...</tr>
    </ng-virtual>
    <tr>...</tr>
    <tfoot>...</tfoot>
</table>

Повторение первых 3-х trs и последнего tr находятся на одном уровне, но если бы я просто бегло просмотрел код, есть шанс, что я ошибаюсь их как разные уровни, или я начну искать себя утомительно вычислять (возможно, неправильно), на каком уровне работает код, особенно если эти вещи начинают вкладываться.

Вот конкретная версия синтаксиса, которая мне нравится (типа B):

<ul>
  <li>some static prefix item</li>
  <li ng-repeat-block="(name, definition) in myList">{{ something }}</li>
  <li>{{ something else }}</li>
  <li ng-repeat-block-close>{{ something else }}</li>
  <li>some static postfix item</li>
</ul>

@stanvass ваше предложение - это вариант того, что @IgorMinar опубликовал как синтаксис X, основная проблема в том, что поддержки браузера просто нет

Я только что понял, что наличие ng-repeat-start и ng-repeat-end является избыточным в том случае, если вы хотите повторить только один внутренний элемент.

<tr>
  <td ng-repeat-start ng-repeat-end>repeat this</td>
</tr>

Было бы неплохо, если бы у нас также был ng-repeat-single , который предотвратил бы это. бывший.

<tr>
  <td ng-repeat-single>repeat this</td>
</tr>

@ daegon123, если вы хотите повторить один элемент, просто выполните

<tr>
  <td ng-repeat="...">repeat this</td>
</tr>

Не нужно ни ng-repeat-start ни ng- repeat-end

@lgalfaso Спасибо, кажется, я

Я думаю, что это не просто повторение одного элемента. Это больше о том, как повторить набор элементов, не повторяя его родительский элемент. т.е. <dt>..<dd>... - но здесь было много других хороших примеров.

Синтаксис X - единственный, который четко определен после того, как вы начнете повторять вложение. Как бы вы написали в Syntax AD следующее:

<template>
  <dl>
    <ng repeat="book in myList">
      <dt ng-repeat="author in book.authors">{{author.name}}</dt>
      <dd>{{book.title}}</dd>
      <dd>{{book.description}}</dd>
    </ng>
  </dl>
</template>

Это лучшее предложение.
Отправлено с My Blackberry®

-----Исходное сообщение-----
От: daegon123 [email protected]
Дата: 6 мая 2013 г., 22:57:16
Кому: angular / angular.jsangular. [email protected]
Ответить на: "angular / angular.js" [email protected]
Тема: Re: [angular.js] ngRepeat с DL / DD / DT (# 1891)

Я только что понял, что наличие ng-repeat-start и ng-repeat-end является избыточным в том случае, если вы хотите повторить только один внутренний элемент.

<tr>
  <td ng-repeat-start ng-repeat-end>repeat this</td>
</tr>

Было бы неплохо, если бы у нас также был ng-repeat-single , который предотвратил бы это. бывший.

<tr>
  <td ng-repeat-single>repeat this</td>
</tr>

Ответьте на это письмо напрямую или просмотрите его на GitHub:
https://github.com/angular/angular.js/issues/1891#issuecomment -17524685

+1, это большое ограничение.

: +1: с нетерпением жду решения этой проблемы! Сейчас я собираюсь использовать <li> , но хотел бы реорганизовать эту разметку, когда angular выйдет с решением для этого =)

Решит ли это # ​​2783?

да. У нас есть решение, которое только что появилось: e46100f7097d9a8f174bdb9e15d4c6098395c3f2

Закрываю этот вопрос.

Я получил ошибку: <TypeError: Object #<Text> has no method 'hasAttribute'> в этом простом примере:

<table>
        <tr ng-repeat-start="value in [1,2,3,4]">I get repeated</tr>
        <tr ng-repeat-end>I also get repeated</tr>
    </table>

Также возникает проблема, как заявляет gevgeny.
не имеет метода hasAttribute>

<tr>
                <td data-ng-repeat-start="column in selectedItem.Beds" class="text-center">Avail. Beds</td>
                <td data-ng-repeat-end>Extra Bed Spaces</td>
</tr>

@ kharnt0x см. этот запрос puul https://github.com/angular/angular.js/pull/2859

Как бы # 2783 разрешил это:

{[{h: "1",
   o: [{h: "1.1",
        o: [{h: "1.1.1"},
            {h: "1.1.2"},
            {h: "1.1.3"}]},
       {h: "1.2",
        o: [{h: "1.2.1"},
            {h: "1.2.2"},
            {h: "1.2.3"}]},

....

Нужно вывести что-то вроде этого:

<h1>1</h1>
<h2>1.1</h2>
<h3>1.1.1</h3>
<h3>1.1.2</h3>
<h3>1.1.3</h3>
<h2>1.2</h2>
<h3>1.2.1</h3>
<h3>1.2.2</h3>
<h3>1.2.3</h3> 

Какой будет синтаксис?

@ChrisCinelli Попробуйте использовать hgroup

<h1>1</h1>
<hgroup>
    <h2>1.1</h2>
        <hgroup>
            <h3>1.1.1</h3>
            <h3>1.1.2</h3>
            <h3>1.1.3</h3>
        <hgroup>
    <h2>1.2</h2>
        <hgroup>
            <h3>1.1.1</h3>
            <h3>1.1.2</h3>
            <h3>1.1.3</h3>
        <hgroup>
<hgroup>

Итак, похоже, hgroup был удален из HTML5 (http://html5doctor.com/the-hgroup-element/), кроме того, как я уже говорил, проблема более сложная, и теги заголовков использовались только для примера.
Очевидно, что это вариант использования, который следует разрешить, и он нисколько не нарушает философию декларативного представления Angular ...

Рассматривали ли вы CSS для конкретного результата, который вы ищете?
Счетчики?

Видеть:
https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Counters
http://css-tricks.com/almanac/properties/c/counter-increment/

18 июня 2013 г., в 14:46, Крис Чинелли [email protected] написал:

Итак, похоже, что hgroup была удалена из HTML5 (
http://html5doctor.com/the-hgroup-element/), кроме того, поскольку я был
говоря, что проблема более сложная, и теги заголовков использовались только для
пример.
Очевидно, что это вариант использования, который следует разрешить и который не нарушает
всю философию декларативного представления Angular ...

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -19644594
.

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

Единственное решение, которое я нашел до сих пор, - это линеаризация структуры данных в Javascript и использование ng-switch для разных уровней, и это потребует от меня дополнительного уровня div.
Это решение имеет накладные расходы (то есть память и процессор для линеаризации структуры данных), и HTML будет выглядеть намного менее четким, чем шаблон подчеркивания, который я могу использовать вместо этого ...

Можете ли вы сделать директивы для каждого уровня? Я не уверен, что это за
структура, о которой вы здесь говорите, так что я просто цепляюсь за соломинку.
Но по моему опыту, ng-switch вряд ли когда-либо понадобится, если у вас есть
доступ к директивам и ng-include, и ведет к шаблонам спагетти-кода.

18 июня 2013 г. в 16:27 Крис Чинелли [email protected] написал:

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

Единственное решение, которое я нашел до сих пор, - это линеаризация дерева в
Javascript и используйте ng-switch для разных уровней.
Это решение имеет накладные расходы (т.е. память и ЦП для линеаризации данных
структура), и HTML будет выглядеть намного менее ясным, чем
шаблон подчеркивания, который я могу использовать вместо этого ...

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/angular/angular.js/issues/1891#issuecomment -19650391
.

Вот как это выглядит: http://d.pr/i/GSX4
Достаточно короткие метки (1.xx x), описания, количество отметок и т. Д. Происходят из db.
Я изучаю возможность преобразовать эту часть в Angular, но пока без кубиков.

Текущее представление довольно логично и относительно ясно, что происходит.
Если я хорошо понимаю, вы в значительной степени предлагаете разбить каждый уровень в куске javascript.

Мне это кажется более запутанным, менее связным и менее читаемым. Учитывая структуру данных, которая содержит всю информацию для отображения этой панели, зачем мне использовать код в другом файле (модуле / контроллере), если логика полностью связана с представлением и очень специфична для этого представления? ИМХО, контроллер должен быть (а он сейчас в текущей реализации):

  • получить данные из модели
  • передать модель в представление, чтобы фреймворк мог ее отобразить

Конечно, я могу добавить несколько дополнительных div и изменить CSS, но если это необходимо, чтобы заставить его работать с Angular, мне кажется, что Angular мешает тому, как удобно и элегантно делать то, что здесь делается.

Я считаю, что привязка данных в KnockoutJS, которая позволяет как привязку к элементу html <div data-bind="foreach: ..."> так и «синтаксис потока управления без контейнера», <!-- ko foreach: ... --><!-- /ko --> , чрезвычайно полезна, и думаю, было бы здорово, если бы Angular может поддерживать аналогичный набор параметров синтаксиса, очень похожий на синтаксис @bowsersenior .

Подробнее о «бесконтейнерном» варианте Knockout:
http://knockoutjs.com/documentation/foreach-binding.html

+1 для виртуального синтаксиса @ mg1075 .
KnockoutJS упрощает работу с dd и вложенными коллекциями.
например http://stackoverflow.com/questions/20062032/nested-table-using-ng-repeat

Была ли эта страница полезной?
0 / 5 - 0 рейтинги