Многоуровневые таблицы (внутри другого при нажатии)

сценарий

Допустим, я являюсь владельцем крупной компании, у которой много магазинов. В зависимости от того, какую роль (место в организации) у меня есть в компании, у меня будет другой доступ к данным. Там будут разные модули, и для этого конкретного вопроса есть тот, где пользователи, имеющие доступ, могут проходить через ежедневную стоимость и продажи. (Если это законно или нет … все равно, это просто пример).

Таким образом, пользователь получает все данные через REST API из BackEnd (приложение Java) со всеми данными для всех магазинов, к которым у пользователя есть доступ. Затем пользователь должен иметь возможность фильтровать данные с помощью различных комбинаций фильтров. Наиболее актуальным для моего вопроса является интервал дат по дням.

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

Сделано до сих пор

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

JSON

{ "metadata":{ "storesInTotal":"25", "storesInRepresentation":"2" }, "storedata":[ { "store" : { "storeId" : "1000", "storeName" : "Store 1", "storePhone" : "+46 31 1234567", "storeAddress": "Some street 1", "storeCity" : "Gothenburg" }, "data" : { "startDate" : "2013-07-01", "endDate" : "2013-07-02", "costTotal" : "100000", "salesTotal" : "150000", "revenueTotal" : "50000", "averageEmployees" : "3.5", "averageEmployeesHours" : "26.5", "dayData" : [ { "date" : "2013-07-01", "cost" : "25000", "sales" : "15000", "revenue" : "4000", "employees" : "3", "employeesHoursSum" : "24" }, { "date" : "2013-07-02", "cost" : "25000", "sales" : "16000", "revenue" : "5000", "employees" : "4", "employeesHoursSum" : "29" } ] } }, { "store" : { "storeId" : "2000", "storeName" : "Store 2", "storePhone" : "+46 8 9876543", "storeAddress": "Big street 100", "storeCity" : "Stockholm" }, "data" : { "startDate" : "2013-07-01", "endDate" : "2013-07-02", "costTotal" : "170000", "salesTotal" : "250000", "revenueTotal" : "80000", "averageEmployees" : "4.5", "averageEmployeesHours" : "35", "dayData" : [ { "date" : "2013-07-01", "cost" : "85000", "sales" : "120000", "revenue" : "35000", "employees" : "5", "employeesHoursSum" : "38" }, { "date" : "2013-07-02", "cost" : "85000", "sales" : "130000", "revenue" : "45000", "employees" : "4", "employeesHoursSum" : "32" } ] } } ], "_links":{ "self":{ "href":"/storedata/between/2013-07-01/2013-07-02" } } } 

Визуальный пример – JSFiddle

Проверьте значения в рамке результата, в верхнем левом углу. Попробуйте щелкнуть, например, строку с Store ID 2000, затем с 3000 и затем 3000 снова, чтобы увидеть, как изменяются значения. Текущее обновление моего JSFiddle

Требуемая функциональность

Когда щелкнет строка (как показано в JSFiddle), мне нужна директива или что-то срабатывающее, чтобы пойти и получить базовые данные (dayData) для щелчка магазина и показать все дни в интервале дат. Т.е. расширение строки и включение новой таблицы под нажатой строкой, которая также должна использовать ng-repeat, чтобы все отображаемые данные были похожими на существующие, но встроенные.

Вопрос

Таким образом, у меня уже есть функциональность, чтобы получить индекс $ index, а также конкретные данные из щелкнутой строки. Какую директиву или любое другое решение мне нужно дополнительно, чтобы получить «данные при щелчке по строке» и представленные в таблице под нажатой строкой?

Я не хочу этого в DOM все время, так как может быть много dayData для каждого магазина и много магазинов. (И будет использовать разбивку на страницы позже, но даже в этом случае, а не в DOM все время.) Это означает, что я должен иметь возможность ДОБАВИТЬ, когда вы нажимаете на строку, и при нажатии той же или другой УДАЛИТЬ из ранее щелкнутого.


РЕДАКТИРОВАТЬ

Новый обновленный JSFiddle .

Требовалось не заполнять DOM всеми таблицами второго уровня, и я придумал для этого решение.

Сначала я попытался создать настраиваемую директиву, и я получил ее, чтобы вставить строку в нужное место (под нажатой строкой) и создал таблицу второго уровня с заголовками, но не смог заставить ее заполнять строки с помощью ng-repeat.

Поскольку я не мог найти решение, которое полностью работало, я вернулся к тому, что я уже создал, с ng-show и искал такое решение … и есть один. Вместо использования ng-show / ng-hide у Angular есть директива, называемая ng-switch.

На первом уровне

  

… и затем на втором уровне, т. е. второй tr

  

, в котором у вас есть второй уровень ng-repeat.

Вот новый JSFiddle .

Осмотрите элементы, и вы увидите, что есть место для комментариев для каждой таблицы с «свернутым» уровнем 2.


ОБНОВЛЕНИЕ (2014-09-29)

По запросу также расширяется / сворачивается уровень 3, вот новый JSFIDDLE .

ЗАМЕТКА! – Это решение имеет всю информацию в DOM во все времена, то есть не как более раннее решение, которое только добавило нотацию, где информация должна быть добавлена ​​по запросу.

(Я не могу признать это, хотя, поскольку мой друг Аксель разветвил мой, а затем добавил функциональность.)

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

Посмотрите здесь:

PLNKR

      {{person.name}} {{person.gender}}   {{person.details}}  

У меня еще недостаточно репутации, чтобы комментировать, поэтому я отвечаю за ответ с дополнительной проблемой, с которой я столкнулся. Я использовал структуру Pixic успешно, так как мне очень нравится, что DOM не загрязняется данными / таблицами второго уровня, пока они не будут просмотрены, и все работает отлично.

До тех пор, пока меня не попросят разрешить динамическую сортировку таблицы верхнего уровня. Нет проблем – я могу сортировать таблицу верхнего уровня. Проблема в том, что я не смог придумать способ сохранить таблицу второго уровня (т. Е. Скрытую) синхронизированной и «перемещаться» с видом таблицы верхнего уровня. Это только проблема с отображением. Основные данные должным образом связаны с верхним уровнем, но дисплей перепутался с отображением исходной «индексированной» строки, поскольку таблицы второго уровня не пересобираются с родительской строкой.

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

Изменить: по запросу я задал еще один вопрос: многоуровневые таблицы (внутри другого, если они были нажаты) и динамическая сортировка таблицы верхнего уровня

  • угловой ng-bind-html и директива внутри него
  • Как понять «терминал» директивы?
  • В чем разница между ng-app и data-ng-app?
  • Каков наилучший способ условного применения атрибутов в AngularJS?
  • Как применить директиву AngularJS на основе classа, установленного ng-classом?
  • Чтобы проверить настраиваемую директиву angularjs validation
  • AngularJS - Динамическое создание элементов, определяющих директивы
  • Угловой ng-стиль с условным выражением
  • Как выбрать элемент по имени classа с помощью jqLite?
  • Отложить угловое выполнение часов после $ digest (повышение DOM-события)
  • Угловая: вызов функции controllerа внутри функции директивной ссылки с использованием &
  • Давайте будем гением компьютера.