SharePoint Framework. Создаем AngularJS 1.x Client WebPart

Пошаговая инструкция создания клиентской веб-части с использованием SharePoint Framework и AngularJS. 10 простых шагов для создания веб-части SPFx, отображающей данные из списка.

SharePoint Framework

Многие компании используют SharePoint как платформу для создания своих решений. Основными артефактами этих решений являются страницы веб-частей и отдельные веб-части, формирование конечного HTML-кода в которых происходит на стороне сервера. Но современные технологии не стоят на месте. Развитие возможностей клиентских браузеров и JavaScript сделали возможным создание адаптивных веб-приложений, работающих не только на настольных компьютерах, но и на мобильных устройствах.

Современные приложения должны удовлетворять новым требованиям и новая модель для создания решений SharePoint Framework позволяет разработчикам использовать современные инструменты в своей работе и не ограничиваться более возможностями .Net.

Modern всё

SharePoint Framework - это не адаптированный sandbox solution, и не add-in. SharePoint Framework - новый подход к созданию решений, но новый он только для SharePoint разработчиков:

Новое помимо адаптации SharePoint-разработки под современные инструменты - новый интерфейс SharePoint, который называется modern.

В SharePoint Online его можно увидеть в библиотеке документов.

Классический вид:

И modern:

HTML-код modern-страницы без блоков <script>:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html dir="ltr" lang="en-US">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale= 1.0, minimum-scale=1.0, user-scalable=no" />
<link rel="shortcut icon" href="_layouts/15/images/favicon.ico?rev=44" type="image/vnd.microsoft.icon" id="favicon" />
</html>
<body>
</body>

Пустой body (почему-то после html), все содержимое формируется на стороне клиента. В качестве клиентского framework'а можно использовать Knockout, React, AngularJS или какой-либо другой.

Workbench

Так как в SharePoint Framework весь код исполняется на стороне клиента, то возникает вопрос: "Нужен ли установленный SharePoint для разработки решений?".

Этого хватит для элементарной отладки, не более того.

Проект

Переходим к проекту. В качестве примера создадим простую веб-часть, которая будет отображать данные из списка. В работе веб-часть будет использовать AngularJS в качестве JS Framework.

Шаг 0. Node.js

Для создания решений с использованием SharePoint Framework понадобится node.js. Скачиваем и устанавливаем node.js если ещё этого не сделали.

Шаг 1. Создаем проект

Создаем новую папку для будущего проекта:


md StuffWebPart

И переходим в созданную директорию:


cd StuffWebPart

Запускаем Yeoman для создания проекта:


yo @microsoft/sharepoint

При запуске yeoman вводим необходимую информацию:

SharePoint Framework Yeoman

Дожидаемся окончания генерации проекта:

SharePoint Framework Yeoman

Проект уже можно запустить, используя Workbench:


gulp serve

Шаг 2. Устанавливаем AngularJS

В качестве JS Framework будет использован AngularJS. Чтобы его установить запускаем:


npm i angular -S

Помимо этого понадобится TypeScript definition. Для его установки исполняем:


tsd install angular -s

Шаг 3. Добавляем Office UI Fabric

Для UI попробуем использовать Office UI Fabric, точнее его Angular-версию. Добавляем его в проект:


npm i angular ng-office-ui-fabric -S

Все установленные пакеты можно увидеть в файле package.json решения:

Шаг 4. Данные

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

Данные исключительно демонстрационные. Воссоздать такие или похожие руками совершенно недолго. Доступ к данным будет реализован с помощью REST API. Элементы списка получаем по URL'у вида:


https://{TenantName}.sharepoint.com/{SiteUrl}/_api/web/lists(guid'{ListGuid}')/items

Шаг 5. Веб-часть

В коде веб-части перед декларацией класса самой веб-части вставляем следующие строки:


// AngularJS
import * as angular from 'angular';
// Office UI Fabric
import 'ng-office-ui-fabric';
// ModuleLoader
import ModuleLoader from '@microsoft/sp-module-loader';
// EnvironmentType
import { EnvironmentType } from '@microsoft/sp-client-base';

С Angular и Office UI Fabric всё понятно. ModuleLoader используется для регистрации CSS и JS файлов на странице. EnvironmentType помогает определить среду в которой исполняется веб-часть. Всего типов сред четыре:

  • Test (0) - код исполняется в интеграционных или юнит-тестах;
  • Local (1) - код исполняется в workbench. SharePoint REST API недоступен в workbench;
  • SharePoint (2) - код исполняется в client-rendered SharePoint page;
  • ClassicSharePoint (3) - код исполняется на классической странице SharePoint.

ModuleLoader используется для регистрации стилей Office UI Fabric в конструкторе веб-части:


public constructor(context: IWebPartContext) {
  super(context);
  ModuleLoader.loadCss('https://appsforoffice.microsoft.com/fabric/2.6.1/fabric.min.css');
  ModuleLoader.loadCss('https://appsforoffice.microsoft.com/fabric/2.6.1/fabric.components.min.css');
}

Шаг 6. Разметка веб-части

HTML-код веб-части будет в отдельном файле tempaltes/app.html. Содержимое, всего 20 строчек.

/templates/app.html:

Простой вывод информации с помощью компонента Persona и поле для фильтрации.

Блок style - это костыль для Office UI Fabric.

Шаг 7. Angular App

В приложении источником данных будет список SharePoint. Для отправки HTTP-запроса в SharePoint Framework необходимо использовать нативный клиент this.context.httpClient. В этом случае запрос будет отправлен от имени текущего пользователя. SharePoint заполнит все необходимые заголовки в запросе:

В остальном метод render веб-части прост:


public render(): void {
  // Если метод render уже вызывался выходим из метода
  if(this.renderedOnce === true)
  {
    return;
  }
  angular
    .module('StuffApp', [
      'officeuifabric.core',
      'officeuifabric.components'])
    .controller('StuffController', ($scope: ng.IScope):void =>
    {
      // Паттерн фильтра
      ($scope as any).searchPattern = '';
      // Коллекция сотрудников
      ($scope as any).stuff = [];
      // ID списка
      var listId = '2B6B3A8F-6837-4141-A624-5373C2AC0816';
      // URL сайта
      var siteUrl = 'https://vz365.sharepoint.com/rusug'

      // Данные загружаем только если среда исполнения - SharePoint
      switch(this.context.environment.type)
      {
        case 2: // SharePoint
        case 3: // Classic server-rendered SharePoint
            // Запросы только через this.context.httpClient
            this.context.httpClient
              .get(siteUrl + "/_api/web/lists(guid'" + listId + "')/items")
              .then((response: Response) => {
                response.json()
                .then(data=>{
                  // Заполняем коллекцию сотрудников
                  ($scope as any).stuff = data.value;
                  if(!$scope.$$phase)
                  {
                    $scope.$apply();
                  }
                });
              });
      }
    });
  // HTML разметка
  this.domElement.innerHTML = require('./templates/app.html');
  // Bootstrap
  angular.bootstrap(this.domElement, ['StuffApp']);
}

В начале метода проверяем свойство this.renderedOnce и если оно равно true, то выходим из метода.

Так как наше AngularJS приложение необходимо загрузить только единожды, то мы выходим из метода render если этот метод уже вызывался.

Шаг 8. Создание пакета решения

Чтобы доставить решение до Office 365 его необходимо упаковать. В SharePoint Framework решения пакуются в .spapp-пакеты. Сперва необходимо подготовить решение с помощью Gulp:


gulp bundle --ship

И собираем всё в .spapp-файл:


gulp package-solution --ship

Шаг 9. Публикация решения

Для публикации решения достаточно загрузить его в каталог приложений для SharePoint:

При развертывании решения необходимо лишь подтвердить доверие решению. Указание каких-либо прав для решения не требуется.

Дождавшись окончания публикации решения, можно добавлять его на сайт ровно так как это было всегда в SharePoint:

Шаг 10. Добавляем веб-часть на страницу

Созданную веб-часть можно добавить на страницу сайта, выбрав её из группы Custom:

И результат труда:

Исходные коды

Исходные коды доступны на GitHub: SharePoint Framework App.

Виталий Жуков

Виталий Жуков

SharePoint архитектор, разработчик, тренер, Microsoft MVP (Office Development). Более 15 лет опыта работы с SharePoint, Dynamics CRM, Office 365, и другими продуктами и сервисами Microsoft.

Смотрите также

Развертывание списков и библиотек с помощью SPFx-решений

Развертывание списков и библиотек с помощью SPFx-решений

SharePoint. Drag-and-Drop Загрузчик файлов

SharePoint. Drag-and-Drop Загрузчик файлов

CSOM. Загрузка файлов

CSOM. Загрузка файлов

SharePoint List REST API. Часть 2

SharePoint List REST API. Часть 2

SharePoint Framework. Создание веб-части на Angular

SharePoint Framework. Создание веб-части на Angular

SharePoint List REST API. Часть 1

SharePoint List REST API. Часть 1

Презентация с доклада о SharePoint Framework

Презентация с доклада о SharePoint Framework

SharePoint. Регистрация CSS и JavaScript с помощью DelegateControl

SharePoint. Регистрация CSS и JavaScript с помощью DelegateControl

SharePoint. Расширяем REST API

SharePoint. Расширяем REST API

SharePoint Excel Services. Создаем кредитный калькулятор

SharePoint Excel Services. Создаем кредитный калькулятор

SharePoint Ribbon API. Использование ToggleButton

SharePoint Ribbon API. Использование ToggleButton

SharePoint 2013. How To: настройка входящей почты для разработчиков

SharePoint 2013. How To: настройка входящей почты для разработчиков

Мифы и правда о Linq to SharePoint

Мифы и правда о Linq to SharePoint

5 особенностей SPSiteDataQuery

5 особенностей SPSiteDataQuery

SharePoint 2013. Введение в SharePoint App. Часть 2

SharePoint 2013. Введение в SharePoint App. Часть 2

SharePoint 2013. Введение в SharePoint App. Часть 1

SharePoint 2013. Введение в SharePoint App. Часть 1

Превью для веб-части в SharePoint 2010/2013

Превью для веб-части в SharePoint 2010/2013

SharePoint 2013. Еще немного о новых контролах

SharePoint 2013. Еще немного о новых контролах

SharePoint 2013. Контрол ClientPeoplePicker

SharePoint 2013. Контрол ClientPeoplePicker

SharePoint 2013. Контрол ImageCrop

SharePoint 2013. Контрол ImageCrop

SharePoint 2013. Тип поля Geolocation

SharePoint 2013. Тип поля Geolocation

Создание типа поля в SharePoint

Создание типа поля в SharePoint

SharePoint 2010. Длительные операции с обновляемым статусом

SharePoint 2010. Длительные операции с обновляемым статусом

Linq to SharePoint. Создаем ContentIterator

Linq to SharePoint. Создаем ContentIterator

Linq to SharePoint. Получение данных из другой коллекции сайтов

Linq to SharePoint. Получение данных из другой коллекции сайтов

Linq to SharePoint. Версионность

Linq to SharePoint. Версионность

SharePoint. Получение URL-адреса иконки для документа

SharePoint. Получение URL-адреса иконки для документа

SharePoint 2010. PostBack для Fluent Ribbon API

SharePoint 2010. PostBack для Fluent Ribbon API

Linq to SharePoint. Блокировка документов

Linq to SharePoint. Блокировка документов

Linq to SharePoint. Паттерн Repository

Linq to SharePoint. Паттерн Repository

Linq to SharePoint. Получение мета-данных списка

Linq to SharePoint. Получение мета-данных списка

Linq to SharePoint. Мапинг полей

Linq to SharePoint. Мапинг полей

Linq to SharePoint. Формирование данных для ProcessBatchData

Linq to SharePoint. Формирование данных для ProcessBatchData

Linq to SharePoint. Сравнение производительности с Camlex.NET

Linq to SharePoint. Сравнение производительности с Camlex.NET

Linq to SharePoint. Часть 5. Поля Choice и MultiChoice

Linq to SharePoint. Часть 5. Поля Choice и MultiChoice

Linq to SharePoint. Часть 4. Dynamic LINQ

Linq to SharePoint. Часть 4. Dynamic LINQ

Linq to SharePoint. Особенности. Часть 3

Linq to SharePoint. Особенности. Часть 3

Linq to SharePoint. Особенности. Часть 2

Linq to SharePoint. Особенности. Часть 2

SharePoint 2010. PeopleEditor. Установка значения

SharePoint 2010. PeopleEditor. Установка значения

SharePoint 2010. Настройка входящей почты для кастомного списка

SharePoint 2010. Настройка входящей почты для кастомного списка

Linq to Sharepoint. Особенности

Linq to Sharepoint. Особенности

EntityFramework. Оптимистические блокировки

EntityFramework. Оптимистические блокировки