Стремитесь к первому колесу Angular 5 в Китае
Гитхаб:GitHub.com/оранжевый XC/UD…
Link: incompetent-plantation.surge.sh/
В последнее время было построено больше колес, которые предназначены для того, чтобы дать новичкам справочный пример.Согласно текущим отзывам, если стек технологий не соответствует, мало кто нажмет, чтобы прочитать его.В будущем вы можете рассмотреть возможность изменения типа сообщения в блоге.
Я написал один раньшеAngular2 от среды создания до разработки, получил Q4 2016 на segmentfaulttop writerЧетвертое место в списке статей теперь занимает angular 5
Общее впечатление у всех такое, что большие скачки версий принесут с собой критические изменения, потому что angular с 1.x на 2.x — это просто два фреймворка, нет, просто два фреймворка.
Angular 1.x называется angular.js, а после angular 2.x он называется angular, и две версии размещены в двух репозиториях github.
Что меня еще больше удивило, так это то, что звезда angular.js близка к двойнику angular, а сообщество более процветающее.В этой статье изо всех сил пытаются найти компоненты, которые можно использовать с angular 5, потому что фреймворк только что был обновлен. , а соответствующие компоненты не обновлялись.Расскажу позже.Небольшой совет всем.
От angular 2 до 4 и до 5 количество компонентов уменьшается экспоненциально, но, к счастью, его можно легко продлить назад.Если вы знакомы с angular 2, этот проект можно полностью понять.
На самом деле написать колесо может любой, кто читает документ, я стараюсь рассказать о как можно большем количестве подводных камней, чтобы разработчики могли их избежать.
Засучи рукава.
Создайте среду разработки
npm install -g @angular/cli@1.5.0
Тут прямо укажите версию 1.5.0
ng new PROJECT-NAME
cd PROJECT-NAME
На данный момент зависимость установлена, выполнитеng -v
, вы можете увидеть следующее
ng serve
Порт по умолчанию 4200, вы можете увидеть страницу инициализации.
Процесс установки может быть долгим, рекомендуется устанавливать yarn локально, при установке зависимостей cli будет автоматически использовать yarn для установки зависимостей, что будет намного быстрее.
В этот момент его можно развивать.
развивать
От публичного интерфейса словаря удао отказались, используемый здесь интерфейс является неофициальным и поддерживает ограниченные функции.
Явно используемая здесь библиотека пользовательского интерфейса:ng-bootstrap, загрузка используетngx-loading
При установке будет предупреждение, что версия зависимостей не совпадает, вот так
Но еле юзабельно.Как уже было сказано ранее, найти подходящую библиотеку компонентов сложно.Вот небольшая хитрость,заходим в поиск googleangular [some component]
В основном это компоненты angular 1.x, поэтому, согласно историческому анализу, имена компонентовng-
ng2-
, в 4 все устали, поэтому просто позвонилиngx-
, поиск напрямуюngx-[some component]
.
почему здесьng-bootstrap
вместо выбораngx-bootstrap
Ну, действительно естьngx-bootstrap
,потому чтоng-bootstrap
только поддержкаbootstrap4
, последний поддерживает 3 и 4, во избежание споров о версиях используйте напрямуюng-bootstrap
.
Говоря об этом, это далеко не доказательство того, что эту библиотеку может использовать angular 5. Мой стандарт суждения — angular 4. Если angular 4 поддерживается, то 90% поддерживают angular 5, потому что изменения действительно невелики.
маршрутизация
В настоящее время этот проект включает только 4 маршрута.
-
/
Дома -
/translate
переводить -
/search
нечеткий поиск -
/detail/:word
детали слова
существуетapp.module.ts
Определите маршрут ниже
const routes: Routes = [
{
path: '',
component: HomeComponent
}, {
path: 'translate',
component: TranslateComponent
}, {
path: 'search',
component: SearchComponent
}, {
path: 'detail/:word',
component: DetailComponent
}
]
Вот некоторые проблемы, связанные с переходами маршрутизации.В angular 5 они по-прежнему делятся на переходы по меткам и переходы по js.
- Как написать этикетку
@Directive({ selector: ':not(a)[routerLink]' })
class RouterLink {
queryParams: {[k: string]: any}
fragment: string
queryParamsHandling: QueryParamsHandling
preserveFragment: boolean
skipLocationChange: boolean
replaceUrl: boolean
set routerLink: any[]|string
set preserveQueryParams: boolean
onClick(): boolean
get urlTree: UrlTree
}
Пример этого проекта:
<li class="nav-item">
<a class="nav-link" routerLink="/" routerLinkActive="active" [routerLinkActiveOptions]="{exact: true}">主页</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/translate" routerLinkActive="active">翻译</a>
</li>
<li class="nav-item">
<a class="nav-link" routerLink="/search" routerLinkActive="active">搜索</a>
</li>
Обратите внимание на яму здесь, первая
li
теги, больше[routerLinkActiveOptions]="{exact: true}"
, если не добавить, приведет к/
При маршрутизации актив не срабатывает.
- нотация js
class Router {
constructor(rootComponentType: Type<any>|null, urlSerializer: UrlSerializer, rootContexts: ChildrenOutletContexts, location: Location, injector: Injector, loader: NgModuleFactoryLoader, compiler: Compiler, config: Routes)
get events: Observable<Event>
get routerState: RouterState
errorHandler: ErrorHandler
navigated: boolean
urlHandlingStrategy: UrlHandlingStrategy
routeReuseStrategy: RouteReuseStrategy
onSameUrlNavigation: 'reload'|'ignore'
config: Routes
initialNavigation(): void
setUpLocationChangeListener(): void
get url: string
resetConfig(config: Routes): void
ngOnDestroy(): void
dispose(): void
createUrlTree(commands: any[], navigationExtras: NavigationExtras = {}): UrlTree
navigateByUrl(url: string|UrlTree, extras: NavigationExtras = {skipLocationChange: false}): Promise<boolean>
navigate(commands: any[], extras: NavigationExtras = {skipLocationChange: false}): Promise<boolean>
serializeUrl(url: UrlTree): string
parseUrl(url: string): UrlTree
isActive(url: string|UrlTree, exact: boolean): boolean
}
Пример этого проекта:
gotoDetail ({ entry }) {
this.router.navigate([`/detail/${entry}`])
}
По сравнению с обзором документа, эти два примера являются самыми простыми в использовании.При необходимости вы можете посмотреть другие методы, которые в основном могут удовлетворить все потребности маршрутизации.
просить
В отличие от vue и react, angular предоставляет интерфейсное решение с полным стеком, включая модуль http, который нужно толькоapp.module.ts
импорт внутри
import { HttpClientModule } from '@angular/common/http'
// ...
imports: [
HttpClientModule
]
// ...
Синтаксис запроса тоже очень простой, посмотреть код можно на github.
Вот небольшая яма, в реализацииdetail
при маршрутизацииngOnInit
Текущие параметры маршрутизации получаются в хуке для запроса, а обновление запроса не запускается при изменении маршрута.Окончательная версия выглядит следующим образом.
код показывает, как показано ниже
ngOnInit () {
this.route.params.subscribe((params) => {
this.loading = true
const apiURL = `https://dict.youdao.com/jsonapi?q=${params['word']}`
this.http.get(`/?url=${encodeURIComponent(apiURL)}`)
.subscribe(res => {
// set component data
this.loading = false
})
})
}
Это было недействительно раньше, потому что это не было написаноthis.route.params.subscribe((params) => {})
, поэтому прослушиватель не будет срабатывать каждый раз
здесьsubscribe
будет продолжать следитьthis.route.params
Изменение.
путь запроса
Как и в случае с базовым URL-адресом axios, мы не хотим писать полный путь для каждого запроса при запросе. Нам нужно настроить глобальный базовый URL-адрес, чтобы сделать путь запроса коротким.
Угловой нужен@Injectable
, знакомая концепция - внедрение зависимостей, подробностей много статей, вот решение для этого требования
@Injectable()
export class ExampleInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const url = 'https://proxy-oagpwnbkpe.now.sh'
req = req.clone({
url: url + req.url
})
return next.handle(req)
}
}
// ...
providers: [
AppComponent,
{ provide: HTTP_INTERCEPTORS, useClass: ExampleInterceptor, multi: true }
]
// ...
Этот код решает проблему с baseURL.
запрос на переадресацию
Обратите внимание на предыдущий раздел здесьconst url = 'https://proxy-oagpwnbkpe.now.sh'
, корневой путь не является правильным путем.
По-прежнему выполняйте слой обработки прокси узла. Междоменные проблемы все еще должны быть решены.
Код службы узла также очень прост, что и используется здесьflyДелайте запросы на стороне узла
код показывает, как показано ниже
const express = require('express')
const fly = require('flyio')
const app = express()
app.use('/', async (req, res) => {
const data = await fly.get(req.query.url).then(res => res.data)
res.set('Access-Control-Allow-Origin', '*')
res.send(data)
})
app.listen(process.env.PORT || 3001)
Суть в том, чтобы вернуть заголовок, установленныйAccess-Control-Allow-Origin: *
, чтобы браузер не блокировал запрос.
поток данных
существуетdetail
Страница разделена на подкомпоненты 5. Конечно, компонент «родитель-потомок» — это очень простой односторонний поток данных.
Пример: html родительского компонента выглядит следующим образом
<app-detail-phrs-list-tab [simple]="simple" [ec]="ec"></app-detail-phrs-list-tab>
подкомпонентcomponent.ts
следующим образом
export class DetailPhrsListTabComponent {
@Input() simple
@Input() ec
}
просто используйте@Input
Получите значение, переданное из родительского компонента.Когда дело доходит до управления глобальным состоянием здесь, это зависит от сложности проекта.
Простое управление глобальным состоянием может создатьglobal.ts
, а затем создайте внедрение зависимостей, как показано ниже.
// globals.ts
import { Injectable } from '@angular/core';
@Injectable()
export class Globals {
role: string = 'test';
}
В компоненте можно вызвать так
// hello.component.ts
import { Component } from '@angular/core';
import { Globals } from './globals';
@Component({
selector: 'hello',
template: 'The global role is {{globals.role}}',
providers: [Globals]
})
export class HelloComponent {
constructor(private globals: Globals) {}
}
Другой способ — знакомая разработчикам SPA глобальная библиотека управления состоянием, например flex, redux
угловой также обеспечиваетangular-redux, рекомендуется для сложных приложений.
Пакуйте и выходите в интернет
Команды упаковки вокругng build
, предоставляет несколько параметров конфигурации, которые здесь описываться не будут.
Развертывание здесь используетsurge
Дружеское напоминание: не размещайте частные проекты на таких публичных сервисах, есть много минусов.
Суммировать
Какой бы ни был фронтенд фреймворк, у него есть свои плюсы, так как проект небольшой, выпустить его здесь нет возможности.rxjs
Мощность angular-cli установлена по умолчанию.Он очень эффективен для обработки сложного асинхронного потока данных.Я написал много колес.В конце концов, это еще образец, но метание не может остановиться.
Связанная документация
Соответствующие документы для этого обновления angular 5 следующие:
Официальная документация:next.angular.io/docs
Официальный блог:blog.angular.IO/версия-5-0…
Официальный кли:GitHub.com/angular/ang…
Старайтесь как можно чаще смотреть через стену, домашнийangular.cn/Документация еще не обновлена.