Подтвердить что ты не робот

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

Сценарий

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

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

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

Выполнено до сих пор

  • Сначала я создал аккордеоны, у которых есть хранилища на уровне аккордеонной группы, а затем следующий уровень данных в таблице, в пределах аккордеона. (Только жестко закодированные данные на данный момент.) Проблема заключалась в том, что соответствующий заголовок представляет собой строку, и после некоторого обсуждения мы почувствовали, что это не было хорошим решением, поскольку заголовок состоял бы из частей данных, которые в таблице были бы отдельные столбцы. Поэтому было бы сложно "коллизировать" данные заголовка, чтобы соответствовать горизонтальным разным "хранилищам" (между заголовками аккордеона) при свертывании (и, конечно, еще более беспорядочно, когда один или несколько аккордеона расширяются).
  • Я заменил аккордеоны таблицей и 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) для щелчка магазина и показать все дни в интервале дат. I. Расширяем строку и включаем новую таблицу под нажатой строкой, которая также должна использовать ng-repeat, чтобы все отображаемые данные были похожими на существующие, но встроенные.

Вопрос

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

Я не хочу этого в DOM все время, так как может быть много dayData для каждого магазина и много магазинов. (И будет использовать разбивку на страницы позже, но даже в этом случае, а не в DOM все время.) Это означает, что я должен иметь возможность добавлять ADD при нажатии на строку и при нажатии на то же или другое REMOVE из ранее нажатого.


ИЗМЕНИТЬ

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

4b9b3361

Ответ 1

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

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

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

В первом уровне

<tbody data-ng-repeat="storedata in storeDataModel.storedata" 
       data-ng-switch on="dayDataCollapse[$index]">

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

<tr data-ng-switch-when="true">

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

Здесь представлен новый JSFiddle.

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


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

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

ПРИМЕЧАНИЕ!. Это решение имеет всю информацию в DOM во все времена, то есть не как более раннее решение, которое только добавило нотацию, где информация должна быть добавлена ​​по запросу.

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

Ответ 2

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

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

PLNKR

<tr ng-repeat-start="person in people">
  <td>
    <button ng-if="person.expanded" ng-click="person.expanded = false"></button>
    <button ng-if="!person.expanded" ng-click="person.expanded = true"></button>
  </td>
  <td>{{person.name}}</td>
  <td>{{person.gender}}</td>
</tr>
<tr ng-if="person.expanded" ng-repeat-end="">
  <td colspan="3">{{person.details}}</td>
</tr>

Ответ 3

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

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

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

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