Рендеринг таблицы JsViews / JsRender с помощью GroupBy атрибута / свойства

#javascript #jsrender #jsviews

#javascript #jsrender #jsviews

Вопрос:

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

Пример JSON:

 "ItemDetails": [
    {
        "Amount": 2000,
        "Name": "Horror Book",
    },
    {
        "Amount": 3500,
        "Name": "Horror Book",
    },
    {
        "Amount": 1000,
        "Name": "Children Book",
    },
],
  

Текущий код описывает каждый элемент, даже если он имеет то же имя.

 {{for ItemDetails}}
{{if Amount}}
            <row>
                <col>{{>Name}}</col>
                <col>{{>Amount}}</col>
            </row>
{{/if}}
{{/for}}
  

Я хочу, чтобы результат был таким:

Книга ужасов 5500

Детская книга 1000

Ответ №1:

Теги JsRender /JsViews {{for}} и {{props}} имеют встроенную поддержку сортировки, фильтрации и т.д., но не имеют встроенной функции groupBy. Но вы можете довольно легко создать его, следуя методам, аналогичным сетке с образцом ~total() .

Вот подход, использующий вспомогательные функции:

 <table><tbody>
  {{for ItemDetails sort="Name"}}
    {{if ~groupBy("Name", "Amount")}}
      <tr>
        <td>{{>Name}}</td>
        <td>{{>~total()}}</td>
      </tr>
    {{/if}}
  {{/for}}
</tbody></table>
  

https://jsfiddle.net/BorisMoore/nx3atd1q/

И вот альтернативная версия, использующая функцию фильтрации в {{for}}:

 <table><tbody>
  {{for ItemDetails sort="Name" filter=~groupBy groupTotal="Amount"}}
    <tr>
      <td>{{>Name}}</td>
      <td>{{:~total()}}</td>
    </tr>
  {{/for}}
</tbody></table>
  

https://jsfiddle.net/BorisMoore/o4pt3brq/

Комментарии:

1. Спасибо. Хотя можете ли вы объяснить, в чем разница между this.data и this.parent.data ?

2. При ~groupBy("Name", "Amount") this этом указатель является представлением. См. jsviews.com/#viewobject@access . Здесь мы находимся в {{for}} цикле, так this же как и «Представление элемента», и this.data это элемент. this.parent является родительским представлением (здесь «представлением массива») и this.parent.data представляет собой массив элементов. См . jsviews.com/#views , чтобы понять иерархию представлений.