Как назначить переменную в Vapor листе? - PullRequest
1 голос
/ 19 января 2020

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

Шаблон выглядит следующим образом.

<div class="card shadow mb-4">
<div class="card-header py-3">
  <h6 class="m-0 font-weight-bold text-primary">DataTables Example</h6>
</div>
<div class="card-body">
  <div class="table-responsive">
    <table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
      <thead>
        <tr>
          #for(colums in page.table.columns) {
              <th>#(colums)</th>
          }
        </tr>
      </thead>
      <tfoot>
        <tr>
          #for(colums in page.table.columns) {
              <th>#(colums)</th>
          }
        </tr>
      </tfoot>
      <tbody>
          #for(row in page.table.rows) {
            <tr>
            #for(data in row.datas) {
               <td>#(data)</td>
            }
            </tr>>
          }
      </tbody>
    </table>
  </div>
</div>
</div>

Для этого сценария это работает. Но скажем, на другой странице у меня другая структура данных. Так что не page.table, а page.grid.table как я все еще могу использовать этот шаблон?

Первоначально я хотел изменить шаблон, используя table.columns вместо page.table.columns, а затем "назначить" переменную таблицы прямо перед тем, как я вставлю шаблон. Таким образом, вы также можете иметь несколько таблиц, если хотите, и просто переназначить table, прежде чем встраивать его.

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

1 Ответ

2 голосов
/ 19 января 2020

Это довольно просто, если вы используете условное выражение, чтобы проверить, существует ли переменная.

#if (page.table != nil) {
    #for(row in page.table.rows) {
        <tr>
             #for(data in row.datas) {
                 <td>#(data)</td>
             }
        </tr>>
    }
}else {
    #for(row in page.grid.table.rows) {
        <tr>
             #for(data in row.datas) {
                 <td>#(data)</td>
             }
        </tr>>
    }
}

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

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

class Wrapper: Content {
   let table: [[String]]

   init(table: [[String]]){
       self.table = table
   }
}

, а затем, если у вас есть page.table, вы приведете его к оболочке, как:

let wrapper = Wrapper(table: page.table)

// Or if you have page.grid.table
let wrapper = Wrapper(table: page.grid.table)

И используйте его в Vapor leaf так:

#for(row in wrapper.table) {
     <tr>
         #for(data in row.datas) {
              <td>#(data)</td>
         }
     </tr>>
}
...