# Начало работы
Зависимости
ECMAScript stage 1 decorators.
Если вы используете Babel, необходим @babel/plugin-proposal-decorators.
Если вы используете TypeScript, включите флаги --experimentalDecorators
и --emitDecoratorMetadata
.
Vue-injector requires a modern JavaScript engine with support for:
If your environment doesn't support one of these you will need to import a shim or polyfill .
Required
The reflect
polyfill should be imported only once in your entire application because the Reflect object is meant to be a global singleton.
Кроме того, все примеры будут использовать полную сборку Vue, чтобы позволить компиляцию шаблонов на лету. Подробнее о различиях сборок читайте здесь. :::
Использовать DI при помощи Vue Injector очень просто. Пример:
# HTML
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/@scandltd/vue-injector/dist/vue-injector.js"></script>
<div id="app">
<h1>Первое приложение!</h1>
<p>
<!-- отображаем тут зарегистрированный компонент-->
<logger/>
</p>
</div>
# JavaScript
// 0. Если используем модульную систему (например через vue-cli),
// импортируем Vue и VueInjector и затем вызываем `Vue.use(VueInjector)`.
// 1. Создаём экземпляр инжектора
// new VueInjector({ store, root: [Service] })
const injector = new VueInjector()
// 2. Создаём и монтируем корневой экземпляр приложения.
// Убедитесь, что передали экземпляр плагина в опции
// `injector`, чтобы позволить приложению знать о его наличии.
const app = new Vue({
injector
}).$mount('#app')
// Всё, приложение работает! ;)
Теперь мы можем создавать сервисы и внедрять их в компоненты нашего приложения.
import { Injectable, Inject } from '@scandltd/vue-injector'
// Регистрируем новый сервис
@Injectable
class LogService extends Inject {}
<template>
// Выведим имя нашего сервиса
{{ LogService.name }}
</template>
import LogService from 'logger'
// Внедряем зависимость в компонент.
Vue.component('logger', {
name: 'logger',
providers: {
LogService
}
})
Внедряя инжектор, мы сможем получить к нему доступ через this.$injector
, а также к внедренным сервисам this.<ServiceName>
внутри любого компонента:
// Home.vue
export default {
computed: {
logger () {
// Мы скоро разберём, что такое `get`
return this.$injector.get(LogService)
}
}
}
В документации мы будем часто использовать экземпляр injector
. Имейте ввиду, что this.$injector
в точности то же самое, что и injector
.