Интеграция с ранним Angular

В этой статье описана интеграция Webix с Angular JS версии 2 и ниже.

Ресурсы для интеграции Webix и Angular не входят в стандартный пакет библиотеки Webix. Вы можете найти их в соответствующем GitHub репозитории.

Структура Webix-Angular приложения

Для интеграции Angular JS с Webix компонентами сделайте следующее:

  • подключите соответствующие ресурсы Angular и Webix в главном файле вашего приложения. Помните, что порядок подключения скриптов здесь играет важную роль. Ресурсы Angular должны подключаться в первую очередь
  • установите директиву ngApp в корне документа, чтобы загрузить приложение. Для удобства, задайте ей название "webixApp"
  • создайте новый модуль, используя название директивы из предыдущего шага, и обязательный параметр "webix", чтобы подключить его к библиотеке Webix.
<!DOCTYPE html> <!--setting directive-->
<html lang="en" ng-app="webixApp">
<head>
  <meta charset="utf-8">
  <title>Webix-Angular App</title>
  <script src="js/angular.min.js"></script>
  <script type="text/javascript" src="../../codebase/webix.js"></script>
  <link rel="stylesheet" type="text/css" href="../../codebase/webix.css">
 
  <script type="text/javascript">
    const app = angular.module('webixApp', [ "webix" ]); // создаем новый модуль
    ... // логика приложения (контроллеры)
</script> </head> <body> <!-- app's html --> </body> </html>

Учитывая то, что логика приложения может быть сложной, лучше всего хранить контроллеры в отдельном файле(-ах):

<script type="text/javascript" src="controllers.js">

Инициализация компонентов Webix

Для работы с Angular, у Webix предусмотрена специальная директива webix-ui, которая запускает приложение. Директива используется с объектом конфигурации в качестве параметра, а код всего приложения будет находиться в контроллере Angular.

Вам нужно указать только пару строчек:

<body ng-controller="webixAppController">
  <div webix-ui="config" webix-ready="doSome(root)"></div>
</body>
  • Этот способ напоминает паттерн инициализации приложения в Webix. Можно думать об объекте конфигурации, как о JSON, который мы передаем в конструктор webix.ui при разработке на Webix
  • Обработчики событий присваиваются с помощью директивы webix-ready. Она вызывает функцию контроллера, которая принимает config root в качестве параметра.

Код контроллера

const app = angular.module('webixApp', [ "webix" ]);
 
app.controller("webixAppController", function($scope){
  const header = { type:"header", template:"App header" };
  const left = { view:"list", id:"a1", select:true, data:["One", "Two", "Three"] };
  const right = { template:"Right area", id:"a2" };
 
  // объект конфигурации
  $scope.config = {
     isolate:true, rows:[ // два ряда
        header,
        { cols:[ 
            left,  // компонент list
            { view:"resizer" }, // компонент resizer
            right // компонент template
        ]}
     ]
  };
});

Related sample: Webix-Angular:Initializing from Config

  • В примере выше мы используем такие компоненты как list, template, layout, resizer line
  • Верхний родительский компонент объекта конфигурации (здесь это лейаут с двумя рядами) должен включать свойство isolate. Это нужно для того, чтобы избежать путаницы с ID в тех случаях, когда на странице уже существует другой объект с таким же ID. Подобный результат можно получить при использовании webix миксина IdSpace.

Обработка событий с помощью директивы "webix-ready"

Директива webix-ready вызывает функцию контроллера с параметром config root. Она позволяет устанавливать обработчики событий для всех компонентов в текущей конфигурации.

<body ng-controller="webixAppController">
  <div webix-ui="config" webix-ready="doSome(root)"></div>
</body>

Root - это верхний родительский компонент в конфигурации вашего приложения. Здесь это layout с двумя рядами.

У корневого (root) компонента есть свойство isolate, которое позволяет задавать неуникальные ID его дочерним элементам. Однако при работе с обработчиками событий, вам необходимо ссылаться на такой дочерний элемент через его root. См. пример ниже:

Код контроллера

app.controller("webixAppController", function($scope){
    $scope.doSome = function(root){
    const list = root.$$("a1"); // обращаемся к list через root объект
    const template = root.$$("a2"); // обращаемся к template через root
 
    list.attachEvent("onAfterSelect", function(id){
        template.setHTML(this.getItem(id).value); 
    });
 
      list.select(list.getFirstId());
  }
});

Внутри функции, которую вызывает webix-ready, ваше Webix-Angular приложение подчиняется общим правилам работы с событиями.

Лейаут с Tabbar и Multiview

В примере ниже используются следующие компоненты: layout, resizer, tabview, и template.

<body ng-controller="webixLayoutController" class="webix_full_screen">
  <div webix-ui="config" style="width:100%; height:100%;"></div>
</body>

Код контроллера

const app = angular.module('webixApp', ["webix"]);
 
app.controller("webixLayoutController", function ($scope) {
  //elements of UI
  const header = { 
      view: "template", id: "header", height: 35, 
        template: `Header #headertext#`, data: { headertext: "" } 
  };
  const main = {
    view: "layout", type: "wide", margin: 10, cols: [
      {
        rows: [
          { view: "text", id: "text", placeholder: "Type something here", width: 200 },
          {},
        ]
      },
      { view: "resizer" },
      {
        view: "tabview", cells: [
          { header: "Tab1", body: { template: "1. Some content here" } },
          { header: "Tab2", body: { template: "2. Other content here" } },
        ]
      }
    ]
  };
  const footer = { view: "template", template: "Footer", height: 35 };
 
  //configuration
  $scope.config = {
    id: "topview",
    type: "space",
    rows: [
      header,
      main,
      footer
    ]
  };
});

Related sample: Webix-Angular:Layouts

Компонент Datatable

Webix datatable — это комплексный виджет для работы с большими наборами данных. Таблица из примера ниже состоит из 4 столбцов. Для нее установлена автонастройка высоты, которая будет зависеть от контента, а также возможность выбирать ряды. У каждого столбца есть уникальный ID, метод сортировки, и хедер.

<body ng-controller="webixGridController">
  <div 
    webix-ui="config" 
    webix-data="records"  
    webix-watch="false"
    style="width:750px;">
  </div>
</body>

Код контроллера

const app = angular.module('webixApp', ["webix"]); 
 
app.controller("webixGridController", function ($scope) {
  $scope.records = [
    // records configuration
  ];
 
  $scope.config = {
    view: "datatable",
    id: "grid",
    autoheight: true,
    select: "row",
    columns: [
      // columns configuration
    ],
  };
});

Related sample: Webix-Angular:Grid

О загрузке данных читайте в этой статье.

Компонент Chart

Webix chart — это удобный инструмент для визуализации данных. Для диаграммы из примера ниже установлен тип bar. Она демонстрирует рейтинг продаж и отображается без границ.

<body ng-controller="webixChartController">
  <div 
    webix-ui="config" 
    webix-data="lines"
    webix-watch="false"
    style="width:500px; height:200px;">
  </div>
</body>

Код контроллера

const app = angular.module('webixApp', ["webix"]);
 
app.controller("webixChartController", function ($scope) {
  $scope.lines = [
    // lines configuration
  ];
 
  $scope.config = {
    view: "chart",
    id: "mychart",
    type: "bar",
    value: "#sales#",
    borderless: true,
  };
});

Related sample: Webix-Angular:Chart

О загрузке данных читайте в этой статье.

Отображение массивов

При интеграции Webix с Angular вы можете отображать массивы компонентов с директивой Angular ng-repeat, например массив с одинаковыми компонентами Webix:

<body ng-controller="webixChartController">
   <div
      ng-repeat="chart in charts"
      webix-ui="chart.config"
      webix-data="chart.data"
      webix-watch="false">
  </div>
</body>

где chart — это переменная из области видимости, которая включает массив конфигураций компонентов:

$scope.charts = [
  { data:chart_data, config: chart },
  { data:chart_data, config: chart }
];

Related sample: Webix-Angular:Using ng-repeat

Отображение сложных лейаутов

Интеграция Webix-Angular позволяет создавать сложные приложения с использованием связанных между собой Webix компонентов.

Детали можно узнать в этом примере: Webix-Angular:Complex Initialization

Как управлять видимостью компонента

В отличие от обычных HTML элементов, вы не можете прятать и показывать компоненты Webix с помощью соответствующих директив ngShow и ngHide.

Дополнительные материалы для изучения

Наверх