Для разработки на APS.NET Core 3 я буду использовать VisualStudio 2019. Но вы можете использовать также VisualStudio Code, которая полностью бесплатная и кроссплатформенная. Кстати, VS2019 тоже работает на линуксе. Запустим VS2019.Выберите создать новый проект (Create a new project)
Далее нас ждет также обновлённая панель. Где мы можем выбрать тип проекта. Выберите ASP.NET Core Web Application.
Обратите внимание что в пункте ASP.NET Core Web Application внизу перечислены операционные платформы, на которых можно запускать наше приложение. Windows, Linux, macOS. Таким образом мы понимаем, что запускаем кроссплатформенное приложение.
В следующем окте выберите версию ASP.NET Core 3.0
Если Вы не видите ASP.NET Core 3 в VisualStudio 2019, то скорее всего у вас отключены превью версии. Чтобы их включить перейдите в опции Tools -> Options -> Environment -> Preview Features и проставьте галочку в опции «Use preivews of the .NET Core SDK«
Какие шаблоны проектов содержит VisualStudio 2019
По умолчанию у нас несколько проектов. Тут можно создать пустой ASP.NET проект.
Empty — можно создать пустой ASP.NET проект
API — это ASP.NET проект, который использует чаще всего формат передачи данных JSON или XML. Это наиболее популярный сейчас тип проекта.
Worker Service — это новый тип проекта, который упрощает работу со службами Windows. Служба это — программа, которая работает в фоновом режиме. Новый тип призван облегчить создание служб как на Windows так и на Linux. В Linux подобных системах такие службы называются демотом (Cron Daemon)
Web Application — проект для разработки сайтов, который использует классическую модель, более похожую на win forms.
Web Application (Model-View-Controller) — проект который использует довольно старую модель MVC, но супер популярную сегодня.
ASP.NET Core 3 кроссплатформенный, высокопроизводительный и абсолютно беспалый фреймворк от Майкрософт (Microsoft). Да-да вы не ослышались беспалый и кроссплатформенный. Это означает что вы можете использовать его на Linux подобных серверах.
Кто выбирает ASP.NET Core 3?
Миллионы разработчиков, которые знакомы с ASP.NET 4.x (старые версии не кроссплатформенные.) и которые хотят использовать знакомый и мощный инструмент.
ASP.NET Core 3 дает нам следующие преимущества:
Спроектированный для UI (user interface) и веб API
Удобная система юнит тестов.
Использует движок Razor, который позволяет сделать html динамическим.
Кроссплатформенный. Т.е. вы можете запускать как на Windows так и на macOS, and Linux.
Опенсорсный т.е. с открытым исходным кодом.
Хорошо интегрирован с современными клиентскими фреймворками. (кстати в VS есть очень удобные шаблоны под Angular и React.)
Содержит удобные инструменты для хостинга в облаке. В одной из статей рассказываю как можно развернуть приложение в облаке правда ASP.NET Core 2, но 3-ий поддерживает всё тоже самое.
Встроенная система разрешения зависимостей или DI (dependency injection)
Облегченный (т.е. нет тех огромных зависимостей что были в старых ASP.NET 4.x). Хорошо оптимизирован, что выдает высокую скорость работы. Поддерживает принцип модульности для HTTP запросов через pipeline (пайплайн)
Ability to host on IIS, Nginx, Apache, Docker, or self-host in your own process.
Самое крутое, что можно хостить не только на IIS (веб сервак чисто под винду) :). Но также на Nginx (читайте настройку под Nginx ASP.NET пока core 2), Apache, Docker и self-host (т.е. вообще без сторонних серверов, запустил на своем пк и пожалуйста, работай.)
В чем же разница ASP.NET Core 2.x, 3.x .NET Framework (старая версия) и .NET Standard?
ASP.NET Core 2.x может работать с ASP.NET Core или .NET Framework. Но имейте ввиду что если вы добавите библиотеку из .NET Framework в свой проект на Core, то она будет работать только на MS Windows. Чтобы убрать такую проблему Microsoft предлагают использовать промежуточный фреймворк .NET Standard. Не пугайтесь это не еще какой-то новый бла бла фреймворк от Майкрософта. Для меня это просто шаблон в VisualStudio который я должен использовать при разработке библиотек. Используйте это как правило. А язык и всё остальное тут везде одинаковые. Другими словами, если у вас в проекте попадается библиотека на .NET Framework скорее всего из-за одной такой «овцы» приложение не будет работать кроссплатформенно. И Вам придется арендовать Windows Server, которые заметно дороже Linux подобных.
Теперь важное замечание! ASP.NET Core 3.0 и выше будте работать только с .NET Core 1.x, 2.x. Как я понял даже без .NET Standard. Как пишет Microsoft это связанно с тем что в 3-ей версии кроссплатформенность, производительность, поэтому если вы подтяните что-то их видновой реализации это может испортить все плюшки.
Что уберут или заменят в ASP.NET Core 3
Json.NET (Newtonsoft.Json) — Newtonsoft уберут и заменят на нативную (родную) реализацию, которая должна работать значительно быстрее предшественника. Работать она будет с использованием нового unsafe класса Span[T], ReadOnlySpan[T].
Пытаясь задиплоить функции firebase получил довольно неясную ошибку, без адекватного лога, а просто сырое «Error Occurs When Deploying Firebase Function».
Решить удалось довольно просто. Надо поменять версию npm, в моем случае на 8-ую версию. Эта версия скорее всего должна соответствовать среде на сервер firebase («runtime»:»nodejs8″). Возможно, на момент прочтения статьи на сервере firebase будет выше версия.
Я помел версию на 8.10.0 через менеджер версий nodejs. (Node version manager).
Идея приложения, следующая : Сервер у нас на dotnet core. А клиент на angular 7 (2+) с использованием SSR (server site rendering) или universal angular
VPS
Нам нужен VPS сервер. Я использую яндекс.облако. Они пока что дают 2 месяца бесплатного использования. Для экспериментов думаю вполне достаточно.
Как добавить виртуальную машину в яндекс облаке.
Если у вас есть другой VPS пропустите этот блок.
Если вы уже зарегистрировались и активировали пробную версию.
2. Перейдем во вкладку compute cloud
3. Нажмите на «Создать ВМ»
4. Введем простую конфигурацию ВМ
5. Добавим SSH-ключ
Запустите cmd.exe или powershell.exe. И введите следующую команду.
ssh-keygen -t rsa -b 2048
Я запускал на windows 10 и у меня вылетало сообщение ‘ssh-keygen’ is not recognized. Я просто запустил эту команду в git-bash. Есил еще не установили его установите очень нужная и полезная штука.
В папке /c/Users/username/.ssh/id_rsa у вас появится файлы id_rsa и id_rsa.pub
Добавим содержимое файла id_rsa.pub в поле SSH-ключ
Подлючимся к VPS серверу и установим несколько компанентов.
На вашем VPS установим следующие компоненты.
Install .NET Core Runtime on Linux Ubuntu 18.04 — x64
Install supervisor
Install .NET Core Runtime on Linux Ubuntu 18.04 — x64
Чтобы наше .NET Core приложение запускалось на линуксе надо установить runtime среду. Которая и будет запускать нашу сборку.
Сделаем сборку на разработческой машине. Я делаю сборку в VisualStudio 2019. Но вы можете воспользоваться командой dotnet publish. Естественно, чтобы данная команда сработала не забудьте установить SDK. Вы можете сделать сборку и на сервере.
dotnet publish --configuration Release
Результатом сборки это файлы .dll. Найдите .dll файл стартового проекта (startup project). Например MyProject.dll.
Запустим сборку на сервере командой
dotnet MyProject.dll
Попробуйте обратиться по ip вашего сервера с указанием порта, например 52.155.122.144:5000, приложение должно запуститься.
Но есть проблема. Если закрыть консоль, то приложение отключится. Чтобы эту проблему решить надо запустить приложение в фоновом режиме, как службу. К счастью для этого можно использовать сторонней софт superviser, который ставиться невероятно просто.
sudo apt-get install supervisor
Добавим файл в директорию /etc/supervisor/conf.d/hellomvc.conf
В этом уроке мы разберём создание выпадающего списка (Spinner) в Android Studio.
Spinner — это выпадающий список, позволяющий разработчику мобильного приложения предоставить пользователю возможность выбора тех или иных действий, которые будет выполнять приложение.
Создадим новое приложение в Android Studio, выбрав Start a new Android Studio project. Назовём проект SpinnerLesson (поле Application name). Домен компании назовём lessons.ru (поле Company domain). Выберем каталог расположения нашего проекта в поле Project location. И нажмём кнопку Next
В следующем окне можно выбрать настройки в соответствии и изображением и нажать Next. Выберем Empty Activity (пустой активити) и нажмём Next. Имя главного Activity, можно оставить так, как есть, то есть MainActivity и нажать Finish. После создания проекта в открывшемся окне есть один Activity, это MainActivity. Теперь перейдём к представлению главного Activity, то есть к activity_main.xml. Activity_main.xml представляет собой xml файл и хранится в папке ресурсов res в подпапке layout.
Заменим всё содержимое activity_main.xml на следующее:
Теперь перейдём к MainActivity и отредактируем его таким образом, чтобы его содержимое соответствовало следующему коду:
package ru.lessons.spinnerlesson;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
{
//Массив для заполнения списка
private String[] autoBrands = {"Toyota", "Nissan", "BMW"};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> autoBrandsAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, autoBrands);
autoBrandsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//Находим выпадающий список по его id spAutoBrands
Spinner spAutoBrands = (Spinner) findViewById(R.id.spAutoBrands);
//Устанавливаем адаптер
spAutoBrands.setAdapter(autoBrandsAdapter);
//Устанавливаем обработчик события списка,
//который будет срабатывать при выборе элемента списка
spAutoBrands.setOnItemSelectedListener(onItemSelectedListener());
}
//Обработчик события списка
AdapterView.OnItemSelectedListener onItemSelectedListener()
{
return new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
//Выводим на экран содержимое элемента списка
Toast.makeText(getBaseContext(), parent.getSelectedItem().toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent)
{
}
};
}
}
Где строковый массив private String[] autoBrands = {«Toyota», «Nissan», «BMW»} – это пункты выпадающего списка. Функция onItemSelectedListener() – это обработчик события, который срабатывает при выборе элемента списка. Toast.makeText(getBaseContext(), parent.getSelectedItem().toString(), Toast.LENGTH_SHORT).show() выводит содержимое выбранного элемента списка на экран. Первый параметр этой функции — это контекст, второй параметр — само сообщение, третий параметр — временной интервал, в течении которого сообщение будет находиться на экране.
Вы чувствуете эту тихую пока еще просто жужжащую дрожь под землей? Что-то движется грандиозное и могучее. Это нечто сделает миллионы людей несчастными или счастливыми в зависимости от того как встретить чудовище. Этот монстр ничто иное как «четвертая техническая революция». В последнее время я много размышлял на эту тему когда начал читать про нейронные сети. Нет, сами нейронные сети не вызвали у меня удивления я до сих пор думаю, что технология не совсем перспективная, а перспективнее на мой взгляд deep machine learning из которой и вышли нейронные сети. Т.е. мы получили новый «хайп» в мире ИИ – нейронную сеть к этому хайпу подключаются миллионы специалистов и серьезных it игроков. Еще недавно изучения ИИ было занятием «закрытым» этим занимались институты и редкие специалисты. Если в мире IT о чем-то стали громко говорить значит это приносить результат. В 2006 году казалось просто невозможным определить нарисованное на картинке, если бы вы сказали, что через 10 лет это станет абсолютно реально, то скорее всего вам бы не поверили, звучит слишком романтично. А сегодня сервис https://www.captionbot.ai легко определяет изображения на картинке. Кстати авто ру для распознания моделей по изображению тоже использует нейросеть. В любом случае хайм связан с реальными результатами и возможностью заменить сотни тысяч специалистов на рынке.
Самое интересное, что это можно сделать уже сегодня. Например, заменить армию низкоквалифицированных чиновников системой электронного правительства можно уже сегодня. Как известно в России больше 1 миллиона чиновников. Просто невероятная цифра с учетом того, что чиновники как известно еще вредят обществу. О замене чиновников говорит также политолог, доцент кафедры государственного управления Института общественных наук РАНХиГС Екатерина Шульман. Екатерина высказала данную идею 21 апреля, на международной конференции Skolkovo Robotics (https://www.youtube.com/watch?v=NqrVYBVFR_Q). Этот вариант замены звучит как-то даже благородно т.к. не секрет, что мы, люди, не любим чиновников. Однако, одновременно с «паразитами» пропадут такие профессии, как бухгалтеры о чем официально даже высказался минфин предупредив о скором исчезновении профессии. К опасному списку принадлежит профессия оператор колл-центра. А дальше, казалось бы, еще более невероятная профессия, которая реально уже под угрозой – водитель. Даже текущий ИИ может заменить водителя. Множество компаний уже вступили в эту гонку. Примеры искусственного управления автомобилей Тесла, на мой взгляд, самые интересные. На видео не самая хорошая погода, но система справилась.
А тут тесла помогает предотвратить аварии
К сожалению, уже имеются жертвы, один погибший, который доверился автопилоту теслы, но как вы сами понимаете система еще тестируется её не рекомендуют к обязательному использованию.
https://www.youtube.com/watch?v=04—IOjQu8
Есть абстрагироваться от несчастья и сфокусироваться на положительный результат, то сам факт поражает. Еще пройдет пару лет когда система будет полностью протестирована и где-то в 2019 году мы увидим первые автопилоты на фурах. Транспортные компании будут первые кто воспользуется системой автопилота ведь предприниматели очень практичные. Всё это удешевит перевозки еще на несколько пунктов т.к. водителю ненадо платить и работать он может 365/24/7.
Что же касается заводов. Интересны разработки DARPA отцы интернета, которые уже произвели когда-то информационную революцию.
Пока японские роботы еле двигаются и напоминают больше карикатурные игрушки. DARPA делают настоящих роботов, для настоящей жизни с потрясающей системой балансировки.
Магазине где не нужны продавцы кассиры, терминалы самообслуживания.
В общем смысле, когда вы впервые сядете в такси с надежным автопилотом, то можно считать, что 4-ая революция пришла.
ИИ да не совсем
Нейросети не совсем полноценный ИИ с чувствами и интеллектом человека. Даже нейронная сеть это ничто иное как Сеть Хопфилда правда даже эта сеть уже решает сложные задачи, что не может не удивлять. Я как романтик верю, что настоящий ИИ придет с распространением квантового процессора, хотя конечно не факт. Например, Роджер Пенроуз предполагает, что сознания скорее всего работает на квантовом уровне. Хотя в той же википедии такая теория считает не очень правдоподобной и научной. Но как известно вики, как ресурс сам не очень научный. Так или иначе некоторые физики рисуют очень интересные возможности квантовых вычислений и это не только дурацкая и неинтересная для простого пользователя криптография. На самом деле квантовые компьютеры могут куда более интересные вещи, да и квант в принципе.
Так или иначе, но квантовые компьютеры тоже часть 4-ой революции.
В других областях тоже различные интересные открытия, например, в биотехнологии, в качестве редактирования генома с CRISPR/Cas9 и многие другие открытия, но это немного другая история.
Итог
Большинство профессий умрет. Что же делать?
В нормальных, западных странах этот вопрос уже широко обсуждается. Может кто помнит нашумевшую новость о том, что власти Швейцарии намеривались платить всем 2250 евро в месяц за просто так. Для нас это звучит странно, очередное баловство зажравшейся буржуа. Но на самом деле ситуация более глубокая. Такая инициатива — это часть грядущей 4-ой революции. Что будут делать миллионы Швейцарских «бездельников», а вот получить деньги за просто так. Вообще всё это называется “citizen income” (http://citizensincome.org/). Идея простая мы построим роботов, которые заберут наши рабочие места, а мы будем заниматься высоким, более важными делами – наука, творчество, воспитание детей и т.п.
В этом уроке мы продолжим рассматривать возможности анимации летающей кнопки Floating Action Button.
Для этого используем проект созданный в предыдущем уроке, где мы делали эффект плавного скрытия и появления кнопки, и создадим для этой кнопки дополнительный эффект вращения. Если вы ещё не успели ознакомиться с предыдущим уроком, то рекомендую начать с него. Он находиться здесь. Давайте теперь перейдём к каталогу ресурсов проекта. Здесь зайдём в каталог anim, в котором хранятся файлы с настройкой анимации. И первым делом откроем файл, отвечающий за скрытие кнопки, т.е. fab_hide.xml. К двум существующим в нём элементам scale и alpha добавим элемент rotate. Именно этот элемент отвечает за вращение кнопки. После добавления содержимое файла fab_hide.xml должно быть следующим:
Атрибут элемента rotate fromDegrees отвечает за угол наклона кнопки Floating Action Button вправо, или влево на момент начало анимации. А атрибут toDegrees определяет угол, на который будет повёрнута кнопка за установленный период анимации. Значения углов определяется в градусах, т.е. 360 будет означать полный оборот кнопки за период анимации, продолжительность которой определяет duration=»1000″. Знак «-» (минус) означает, что вращение будет происходить против часовой стрелки. Если необходимо, чтобы кнопка за период анимации делала два полных оборота, то нужно указать 360 * 2, т.е. 720 градусов. Атрибуты pivotX и pivotY определяют координату центра по осям X и Y, относительно которой будет происходить вращение кнопки. Т.е. в данном случаи центром вращения кнопки будет геометрический центр самой кнопки.
Теперь перейдём к файлу, который отвечает за появление кнопки, т.е. к fab_show.xml. Туда также добавим элемент rotate, только значение атрибута toDegrees изменим с отрицательного на положительное. Его содержимое должно стать следующим:
Итак, в данном уроке я расскажу о том, как делать простейшую анимацию летающей кнопки Floating Action Button.
Первым делом создайте новое приложение в Android Studio с пустым активити (Empty Activity).
Для работы с Floating Action Button в Android Studio необходимо подключить библиотеку Design. Чтобы это сделать нужно перейти в Gradle Scripts -> build.gradle (Modul: app). В build.gradle (Modul: app) в раздел dependencies добавьте такую строчку:
1
compile‘com.android.support:design:25.3.1’
Должно всё выглядеть примерно так:
После чего нужно синхронизировать проект, нажав на ссылку Sync Now в верхнем правом углу. Теперь можно приступать к созданию летающей кнопки. Первым делом перейдите к представлению MainActivity, т.е. к файлу activity_main.xml, который расположен в app -> res -> layuot, и отредактируйте его содержимое следующим образом:
В примере мы будем использовать две кнопки. Первая кнопка — Floating Action Button, при нажатии на которую она будет плавно уменьшаться до тех пор, пока не исчезнет совсем. Вторая кнопка — Button, при нажатии на которую будет восстанавливаться видимость Floating Action Button. Чтобы кнопки заняли свои позиции внутри контейнера в соответствии со своими настройками, в качестве контейнера в activity_main.xml необходимо использовать CoordinatorLayout.
Далее нам нужно будет создать каталог для хранения файлов с настройками анимации. Для этого перейдём к каталогу ресурсов проекта app -> res и, нажав на нём правой кнопкой мыши, в появившемся меню выберем New -> Android resource directory. В открывшемся окне зададим наименование нового каталога. Назовём его anim. После создания каталога anim создадим в нём файл, отвечающий за скрытие кнопки Floating Action Button. Для этого нажмите правой кнопкой мыши на каталоге anim и в появившемся меню выберите New -> Animation resource file. Назовите его fab_hide.
Теперь аналогичным образом нужно создать ещё один файл, который будет отвечать за появление кнопки Floating Action Button. Назовите этот файл fab_show и отредактируйте его содержимое так:
fillAfter=»true» означает, что преобразование будет выполнятся после завершения анимации. duration=»1000″ устанавливает время выполнения анимации в миллисекундах. В данной ситуации установлено 1000 миллисекунд, или 1 секунда. shareInterpolator=»true» устанавливает возможность использования интерполятора всеми дочерними элементами. Элемент scale отвечает за изменение размера кнопки при анимации, где параметры fromXScale и fromYScale — это начальные значения масштабов кнопки по осям X и Y на момент начала анимации, а параметры toXScale и toYScale — это конечные значения масштабов на момент завершения анимации. Значения этих параметров имеют тип float и варьируются от 0 до 1. Значение 1.0 соответствует натуральному масштабу. Параметры pivotX и pivotY указывают на координату внутри кнопки, относительно которой происходит изменение размера кнопки. Т.е. эта координата становиться центром, относительно которого кнопка уменьшается при её скрытии, или увеличивается при её появлении. Элемент alpha отвечает за прозрачность кнопки, где значение 1.0 соответствует абсолютной непрозрачности, а 0.0 — абсолютной прозрачности. Параметр fromAlpha — это начальное значение прозрачности, а toAlpha — конечное значение прозрачности.
Теперь перейдите к MainActivity и отредактируйте его код следующим образом:
В нашем сегодняшнем уроке мы продолжим рассматривать возможности настраиваемого выпадающего списка (Custom Spinner) в Android Studio.
Давайте предположим, что нам необходимо сделать выпадающий список таким образом, чтобы в случаи, когда список развёрнут, то каждый пункт списка отображал бы полную информацию, а в случаи, когда какой-то пункт выбран, то отображалась бы краткая информация. Создайте новое приложение в Android Studio с пустым активити (Empty Activity), и начнём делать наш список. Список будет содержать автомобильные бренды, логотипы этих брендов и информацию о сайте производителя. Пусть в развёрнутом виде нам нужно отображать логотип, наименование бренда и ссылку на сайт, а когда пункт выбран, только логотип и наименование бренда. Создадим шаблон пункта выпадающего списка. Для этого перейдите к каталогу layout ресурсов проекта:
Нажмите на этом каталоге правой кнопкой мыши и в появившемся меню выберите New -> Layout resource file: Назовите его spinner_item: Отредактируйте содержимое spinner_item.xml в соответствии со следующим текстом:
В той же папке layout, где был создан spinner_item.xml аналогичным образом создайте шаблон для выбранного пункта списка и назовите его selected_item.xml. Отредактируйте содержимое selected_item.xml в соответствии со следующим текстом:
После всего этого нам нужно создать класс, который будет содержать в себе информацию о каждом отдельно взятом бренде, т.е. наименование бренда, информацию о сайте и логотип. Для этого перейдём к каталогу, в котором у нас расположен MainActivity и создадим в нём подкаталог, к котором разместим наш класс: Нажмём на нём правой кнопкой мыши. В появившемся меню выберем New -> Package: Назовите новый каталог AdditionalClasses: Нажмите на вновь созданный каталог AdditionalClasses правой кнопкой мыши и выберите New -> Java Class: Назовите новый класс AutoBrandClass:
Отредактируйте его код в соответствии со следующим текстом:
package ru.lessons.customspinnerlesson.AdditionalClasses;
public class AutoBrandClass
{
private String brandName; //Наименование бренда
private String officialSite; //Официальный сайт
private int brandLogo; //Логотип
public AutoBrandClass(String brandName, String officialSite, int brandLogo)
{
this.brandName = brandName;
this.officialSite = officialSite;
this.brandLogo = brandLogo;
}
public String getBrandName()
{
return brandName;
}
public String getOfficialSite()
{
return officialSite;
}
public int getBrandLogo()
{
return brandLogo;
}
}
В том же каталоге, где был создан каталог AdditionalClasses создайте ещё один каталог и назовите его Adapters. Должно получиться так: Теперь создадим адаптер для выпадающего списка. Нажмите на каталоге Adapters правой кнопкой мыши и выберите New -> Java Class (Все действия аналогичны тем, которые мы делали при создании класса AutoBrandClass). Назовите этот класс AutoBrandsSpinnerAdapter. Отредактируйте его код в соответствии со следующим текстом: Теперь нам понадобятся три графических png файла, который будут содержать логотипы брендов — toyota.png, nissan.png и bmw.png. Их нужно просто скопировать в каталог drawable проекта:
Можно ограничится первыми двумя, но я рекомендую установить сразу всё. После того как «проект нашей мечты» будет добавлен в папку можете открыть его в редакторе. Я открою проект в visual studio code. Теперь всё что нам нужно это настроить проект для работы с redux. Добавим в проект папку redux куда будем помещать всё связанное с инфраструктурой redux. Внутри папки добавим еще одну папку reducers – тут мы будет хранить наши редьюсеры.
Добавим файл helloReducer.ts и поместим следующий код
В данном случае у нас одно состояние (helloState) на один редьсер как добавить больше состояний покажу позже. В данном случае всё что делает редьюсер это просто добавляет слова hello world. Давайте протестируем как это будет выглядеть на деле.
Еще немного настроек. Перейдите в файл app.module.ts – наш стартовый модуль где начинается наше angular 2+ приложение. Добавьте в imports модуль StoreModule из библиотеки @ngrx/store и наш с вам единственный на данный момент редьюсер helloReducer.
Файл app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { StoreModule } from "@ngrx/store";
import { helloReducer } from "app/redux/reducers/helloReducer";
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
StoreModule.provideStore(helloReducer)
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Еще рекомендую добавить модуль, для тестирования который позволит нам запустить мощный инструмент для отслеживания работы Redux devtools chrome extention
Для этого добавим еще
StoreDevtoolsModule.instrumentOnlyWithExtension()
В итоге весь наш модуль теперь выглядит так
Файл app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { StoreModule } from "@ngrx/store";
import { StoreDevtoolsModule } from "@ngrx/store-devtools";
import { helloReducer } from "app/redux/reducers/helloReducer";
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
StoreModule.provideStore(helloReducer),
StoreDevtoolsModule.instrumentOnlyWithExtension()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Теперь мы спокойно можем вызвать наш Store в любом компоненте.
Добавим store через механизм внедрения зависимостей. Обратите внимание что мы не задумываемся как всё это работает модули ngrx уже настроены под всё необходимое за нас.
Поэтому добавим три метода в компонент
Файл app.component.ts
import { Component } from '@angular/core';
import { Store } from "@ngrx/store";
import { helloState } from "app/redux/reducers/helloReducer";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent
{
title = 'app';
constructor(private store: Store<helloState>) { }
onAddHello()
{
this.store.dispatch({ type: "ADD_HELLO" })
}
onAddWorld()
{
this.store.dispatch({ type: "ADD_WORLD" })
}
onRemoveHelloWorld()
{
this.store.dispatch({ type: "REMOVE_HELLO_WORLD" })
}
}
И мы увидим наше сообщения по умолчанию «Сорри тут пусто :(»
Нажмите последовательно на кнопки addHello, addworld, removeHelloWorld мы увидим в DevTools как меняется состояние.
Здорово значит всё работает!
Но как отобразить данные изменения в представление. Подписываемся на изменения состояния в angular redux ngrx. Всё что нужно сделать это подписаться на изменения к нашему хранилищу или store. В конструкторе класса AppComponent добавьте инструкцию.