Ранее в Как создать компонент диаграммы в Angular 2 и D3 (пересмотренная версия) я объяснил, как создать компонент диаграммы с помощью Angular 2 и D3, я знаю, что обещал создать блог для ng2d3 и я сделаю это, но сначала.

Мне нужно объявить кое-что очень важное. Я очень рад опубликовать информацию о том, что в LoopBack SDK Builder добавлена ​​замечательная функция; его название FireLoop !!!!!

[Общественные аплодисменты и ожидания на заднем плане]

ПРЕДСТАВЛЕНИЕ FIRELOOP.IO

FireLoop - это новая платформа реального времени, построенная на основе LoopBack, которая заменяет стандартный REST API и превращает эту замечательную и зрелую структуру в мощный механизм реального времени.

Я хочу, чтобы эта статья оставалась технической и не заостряла внимание на других деталях, если вы хотите прочитать о мотивации, сравнении других фреймворков и т. Д. Пожалуйста, ПРОЧИТАЙТЕ ЗДЕСЬ

ОПИСАНИЕ ПРОЕКТА

Теперь, когда вы имеете представление о том, что такое FireLoop, я хочу показать вам, как создать приложение Todo в реальном времени с использованием этих технологий.

Я всегда решаю использовать приложение Todo, когда технология настолько нова или важна, что на данный момент фактическое приложение результатов не имеет особого значения, это позволит новым разработчикам легко понять, а не использовать более сложные примеры.

ТРЕБОВАНИЯ

Мы собираемся создать приложение реального времени, используя Angular 2, LoopBack и FireLoop, поэтому вам потребуются следующие глобальные пакеты для установки.

$ npm install -g strongloop angular-cli

СОЗДАТЬ API

Сначала мы собираемся создать наш API LoopBack, а затем мы установим FireLoop поверх, чтобы задействовать возможности реального времени.

$ mkdir todo-project && cd todo-project
$ mkdir todo-api && cd todo-api
$ slc loopback
 _ — — -_ 
 | | ╭──────────────────────────╮
 | — (o) — | │ Let’s create a LoopBack │
 ` — — — — -´ │ application! │
 ( _´U`_ ) ╰──────────────────────────╯
 /___A___\ /
 | ~ | 
 __’.___.’__ 
 ´ ` |° ´ Y ` 
? What’s the name of your application? todo-api
? What kind of application do you have in mind? api-server (A LoopBack API server with local User auth)
? Which version of LoopBack would you like to use? 2.x

УСТАНОВИТЕ МОДУЛИ FIRELOOP

Теперь нам нужно установить и настроить необходимые модули для работы FireLoop.

$ npm install — save @mean-expert/{loopback-sdk-builder,loopback-component-realtime}

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

Но прежде я могу пообещать, что, когда закончу работу с командным инструментом; вам нужно будет установить только 1 пакет с нулевыми конфигурациями. Поэтому я вернусь к этой статье, избегая всего следующего.

НАСТРОЙКА МОДУЛЯ РЕАЛЬНОГО ВРЕМЕНИ

Откройте файл server/server.js и измените метод app.start следующим образом:

app.start = function() {
 // start the web server
 var server = app.listen(function() {
 app.emit(‘started’, server);
 var baseUrl = app.get(‘url’).replace(/\/$/, ‘’);
 console.log(‘Web server listening at: %s’, baseUrl);
 if (app.get(‘loopback-component-explorer’)) {
 var explorerPath = app.get(‘loopback-component-explorer’).mountPath;
 console.log(‘Browse your REST API at %s%s’, baseUrl, explorerPath);
 }
 });
 return server;
};

Теперь откройте файл server/component-config.json и измените его следующим образом:

{
 “loopback-component-explorer”: {
 “mountPath”: “/explorer”
 },
 “@mean-expert/loopback-component-realtime”: {
 “auth”: false // For this example, we will see authentication in another post.
 }
}

НАСТРОИТЬ SDK BUILDER

Откройте файл package.json и добавьте в раздел скриптов следующее:

{
 “name”: “todo-api”,
 “version”: “1.0.0”,
 “main”: “server/server.js”,
 “scripts”: {
 …
 “build:sdk”: “./node_modules/.bin/lb-sdk server/server ../todo-app/src/app/shared/sdk”
 },
 …
}

Хорошо, теперь у нас есть конфигурации Back-End, но прежде чем мы перейдем к части Angular 2, давайте просто создадим простую модель Todo.

СОЗДАТЬ МОДЕЛЬ ТОДО

$ slc loopback:model Todo
? Enter the model name: Todo
? Select the data-source to attach Todo to: db (memory)
? Select models base class PersistedModel
? Expose Todo via the REST API? Yes
? Custom plural form (used to build REST URL): todos
? Common model or server only? common
Lets add some Todo properties now.
Enter an empty property name when done.
? Property name: text
? Property type: string
? Required? Yes
? Default value[leave blank for none]:

СОЗДАТЬ ПРИЛОЖЕНИЕ ANGULAR 2

$ cd ../
$ ng new todo-app
Visit http://ember-cli.com/user-guide/#watchman for more info.
installing ng2
 create .editorconfig
 create README.md
 create src/app/app.component.css
 create src/app/app.component.html
 create src/app/app.component.spec.ts
 create src/app/app.component.ts
 create src/app/app.module.ts
 create src/app/index.ts
 create src/app/shared/index.ts
 create src/assets/.gitkeep
 create src/assets/.npmignore
 create src/environments/environment.prod.ts
 create src/environments/environment.ts
 create src/favicon.ico
 create src/index.html
 create src/main.ts
 create src/polyfills.ts
 create src/styles.css
 create src/test.ts
 create src/tsconfig.json
 create src/typings.d.ts
 create angular-cli.json
 create e2e/app.e2e-spec.ts
 create e2e/app.po.ts
 create e2e/tsconfig.json
 create .gitignore
 create karma.conf.js
 create package.json
 create protractor.conf.js
 create tslint.json
Successfully initialized git.
Installing packages for tooling via npm.

СОЗДАТЬ FIRELOOP SDK

$ cd todo-api
$ npm run build:sdk

УСТАНОВИТЕ ЗАВИСИМОСТИ FIRELOOP SDK

$ cd ../todo-app
$ npm install — save socket.io-client @types/socket.io-client

Откройте файл todo-app/src/tsconfig.json и добавьте раздел новых типов:

{
 “compilerOptions”: {
 ….
 “types”: [
 “socket.io-client”
 ]
 }
}

И чтобы завершить все эти конфигурации, давайте просто установим модуль SDK в наше приложение Angular 2, открыв todo-app/src/app/app.module.ts и изменив его следующим образом:

import { BrowserModule } from ‘@angular/platform-browser’;
import { NgModule } from ‘@angular/core’;
import { FormsModule } from ‘@angular/forms’;
import { HttpModule } from ‘@angular/http’;
import { SDKModule } from ‘./shared/sdk’;
import { AppComponent } from ‘./app.component’;
@NgModule({
 declarations: [
 AppComponent
 ],
 imports: [
 BrowserModule,
 FormsModule,
 HttpModule,
 SDKModule.forRoot()
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Вау, я знаю, что конфигураций было много… Особенно сложно, если вас привлекает конечный результат, но вы совершенно новичок в LoopBack или даже Angular 2.

Это прекрасный пример того, почему я создаю FireLoop.io (не просто модуль FireLoop, но и Framework), потому что речь идет не о конкуренции с LoopBack; Речь идет скорее о том, чтобы сделать работу с LoopBack удобнее, но также о создании более удобной кривой обучения, предоставляя единую команду, которая настраивает все. Пока этого не произошло, теперь вы знаете, как это настраивается вручную.

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

ДОБАВИТЬ ЛОГИКУ ТОДО

Наконец-то пришло время повеселиться !!! Для этого доработаем наш app.component.ts файл, чтобы он был связан с LoopBack и модулем FireLoop, добавив следующие методы:

import { Component } from ‘@angular/core’;
import { Todo, FireLoopRef } from ‘./shared/sdk/models’;
import { RealTime } from ‘./shared/sdk/services’;
@Component({
 selector: ‘app-root’,
 templateUrl: ‘./app.component.html’,
 styleUrls: [‘./app.component.css’]
})
export class AppComponent {
 title = ‘TODO Application’;
 private todo : Todo = new Todo();
 private reference : FireLoopRef<Todo>;
 constructor(private rt: RealTime) {
 this.reference = this.rt.FireLoop.ref<Todo>(Todo);
 }
 add(): void {
 this.reference.create(this.todo).subscribe(() => this.todo = new Todo());
 }
 update(todo: Todo): void {
 this.reference.upsert(todo).subscribe();
 }
 remove(todo: Todo): void {
 this.reference.remove(todo).subscribe();
 }
}

Действительно просто, да? На самом деле я думаю, что это действительно говорит само за себя, но я хочу поговорить о некоторых деталях:

МОДЕЛИ И ССЫЛКИ FIRELOOP - ВСЕ, ЧТО ВАМ НУЖНО

Да!!! Вы правильно прочитали, но ... Что именно это означает? Что ж ... Это означает, что теперь вы можете избежать создания множества ссылок на свойства и методы, как мы привыкли.

Например, вы обычно создаете private todos: Todo[] = new Array<Todo>() список, но теперь в этом нет необходимости.

Созданный нами справочник FireLoop может быть синхронизирован с сервером для любого изменения списка, и с некоторой помощью Angular 2 вы сможете напрямую его визуализировать следующим образом:

ОБНОВИТЬ APP.COMPONENT.HTML

<h1>
 {{title}}
</h1>
<form (submit)=”add()”>
 <input type=”text” name=”todo” [(ngModel)]=”todo.text” placeholder=”Add Todo” />
 <button>Add</button>
</form>
<ul>
 <li *ngFor=”let todo of reference.on(‘changes’) | async”>
 <input type=”text” name=”todo” [(ngModel)]=”todo.text” />
 <button (click)=”update(todo)”>update</button>
 <button (click)=”remove(todo)”>remove</button>
 </li>
</ul>

Опять же, это действительно простой пример, но я хочу сосредоточиться на одном:

<li *ngFor=”let todo of reference.on(‘changes’) | async”>

Как вы можете видеть, мы используем ссылку FireLoop для прослушивания changes, а с помощью асинхронного канала Angular 2 будет отображать все наши Todos в представлении нашего приложения.

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

Так что можно сделать?

Если у вас есть некоторый опыт работы с Angular 2, у вас уже может быть предположение, что reference.on('changes') на самом деле возвращает Observable, что мы можем ссылаться на него и использовать вместо этого.

…
export class AppComponent {
 …
 private todo : Todo = new Todo();
 private todos : Observable<Todo[]>;
 private reference : FireLoopRef<Todo>;
 constructor(private rt: RealTime) {
 this.reference = this.rt.FireLoop.ref<Todo>(Todo);
 this.todos = this.reference.on(‘changes’);
 }
 … 
}
<li *ngFor=”let todo of todos | async”>

Это не только улучшает производительность, но и позволяет запрашивать то, что действительно требуется разработчику или конечным пользователям. Что это? Язык запросов.

…
export class AppComponent {
 …
 constructor(private rt: RealTime) {
 this.reference = this.rt.FireLoop.ref<Todo>(Todo);
 this.todos = this.reference.on(‘changes’, {
 offset: 0,
 limit: 10,
 order: ‘id DESC’
 });
 }
 … 
}

Это открывает новый мир возможностей, потому что теперь вы синхронизированы с сервером, но вы получаете то, что нужно этому конкретному клиенту, что отлично подходит для списков в реальном времени, чатов, отчетов и т. Д.

Опять же, если вы новичок в LoopBack и хотите знать, какие фильтры доступны, проверьте СЛЕДУЮЩУЮ ИНФОРМАЦИЮ и обратите внимание, что вас интересуют фильтры, а не синтаксис методов, помните, что FireLoop - это совершенно новый интерфейс. .

Если вы хотите узнать больше о синтаксисе FireLoop, ПРОЧИТАЙТЕ ЗДЕСЬ.

ИСПРАВИТЬ УГЛОВОЙ CLI REQUIRE ТИП

На момент написания этой статьи инструмент CLI Angular 2 выдает консольную ошибку, если я не буду об этом говорить; может показаться, что в этом примере есть ошибки. Но, правда ошибка отображается из ванильной установки, но как ее исправить?

Если вы получаете Cannot find name 'require' ошибку, вам нужно просто открыть src/typings.d.ts файл и добавить следующую строку:

declare var require: any;

Это все; у вас должна быть возможность протестировать наше приложение Todo в реальном времени без каких-либо ошибок в консоли.

ТЕСТОВОЕ ЗАДАНИЕ

Если вы запустите оба, интерфейсный / внутренний серверы, вы должны увидеть следующий результат:

Запустить сервер

$ cd to/todo-project/todo-api
$ node .

Запустить клиент

$ cd to/todo-project/todo-app
$ ng serve

Откройте 2 вкладки браузера на http://127.0.0.1:4200 и запустите приложение Todo в реальном времени.

ЧТО СЛЕДУЮЩЕЕ?

Что ж, впереди большой объем работы по созданию фреймворка FireLoop.io, одним из моих приоритетов является интеграция с Angular 2 Universal, так что… Следующими моими шагами будут доставить последнюю статью о ng2d3 и после я представлю улучшения и новые интеграции, чтобы вы могли создавать еще более быстрые и лучшие приложения Angular 2.

Если вам нравится эта серия и вы хотите быть в курсе следующих релизов и новых пакетов, подпишитесь на меня в Twitter @johncasarrubias и, если вы чувствуете это, оставьте здесь комментарий.

Спасибо за прочтение.