Как реализовать angular-mdc-web в шаблоне .NET Core Angular VS2017

Я пытаюсь заставить angular-mdc-web работать с угловым шаблоном vs2017 .net core. Пока без везения.

  • рябь на кнопках странная
  • при нажатии на кнопку кнопка становится полностью белой
  • при изменении размера хрома размер щелчка не перемещается вместе с ним

Взгляните на Demo-Gif: Demo-Gif

РЕДАКТИРОВАТЬ 12.04.2018

Теперь все работает, спасибо тримоксу! Вы можете клонировать / загрузить решение со страницы vs2017-Angluar-Template-with- mdc-web

Согласно следующему Начало работы учебному руководству: Angular MDC - Начало работы

Я знаю, что следующие шаги разрушают загрузочный материал. Но я просто хочу, чтобы кнопка работала.

Вопрос: как заставить работать angular-mdc-web с Angular-Template vs2017? Спасибо за вашу помощь!

Вот как я сделал свою настройку: VS2017 Community Edition 15.6.4

  1. Меню Файл \ Новый \ Проект ...
  2. Веб-приложение ASP.NET Core
  3. Выберите Угловой.

  4. Отредактируйте package.json (готов к angular5 с vs2017, без начальной загрузки)

{
  "name": "WebApplication2",
  "private": true,
  "version": "0.0.1",
  "scripts": {
    "test": "karma start ClientApp/test/karma.conf.js",
    "build:vd": "webpack --config webpack.config.vendor.js",
    "build:cl": "webpack --config webpack.config.js",
    "build:dev": "webpack --progress --color",
    "build:aot": "webpack --env.aot --env.client & webpack --env.aot --env.server"
  },
  "dependencies": {
    "@angular/animations": "^5.2.9",
    "@angular/common": "^5.2.9",
    "@angular/compiler": "^5.2.9",
    "@angular/compiler-cli": "^5.2.9",
    "@angular/core": "^5.2.9",
    "@angular/forms": "^5.2.9",
    "@angular/http": "^5.2.9",
    "@angular/platform-browser": "^5.2.9",
    "@angular/platform-browser-dynamic": "^5.2.9",
    "@angular/platform-server": "^5.2.9",
    "@angular/router": "^5.2.9",
    "@angular-mdc/web": "^0.34.1",
    "es6-shim": "0.35.3",
    "event-source-polyfill": "0.0.12",
    "isomorphic-fetch": "2.2.1",
    "jquery": "^3.3.1",
    "preboot": "6.0.0-beta.3",
    "reflect-metadata": "0.1.12",
    "rxjs": "^5.5.8",
    "zone.js": "^0.8.21"
  },
  "devDependencies": {
    "@ngtools/webpack": "^1.10.2",
    "@types/chai": "^4.1.2",
    "@types/jasmine": "^2.8.6",
    "@types/webpack-env": "~1.13.5",
    "angular2-router-loader": "0.3.5",
    "angular2-template-loader": "0.6.2",
    "aspnet-prerendering": "^3.0.1",
    "aspnet-webpack": "^2.0.3",
    "awesome-typescript-loader": "4.0.1",
    "chai": "^4.1.2",
    "clean-webpack-plugin": "^0.1.19",
    "css": "^2.2.1",
    "css-loader": "0.28.11",
    "expose-loader": "0.7.5",
    "extract-loader": "^2.0.1",
    "extract-text-webpack-plugin": "3.0.2",
    "file-loader": "1.1.11",
    "html-loader": "0.5.5",
    "jasmine-core": "^3.1.0",
    "json-loader": "0.5.7",
    "karma": "^2.0.0",
    "karma-chai": "^0.1.0",
    "karma-chrome-launcher": "2.2.0",
    "karma-cli": "^1.0.1",
    "karma-jasmine": "^1.1.1",
    "karma-webpack": "^2.0.9",
    "loader-utils": "^1.1.0",
    "node-sass": "^4.8.3",
    "raw-loader": "0.5.1",
    "sass-loader": "^6.0.7",
    "style-loader": "0.20.3",
    "to-string-loader": "1.1.5",
    "typescript": "2.7.2",
    "url-loader": "1.0.1",
    "webpack": "^3.10.0",
    "webpack-hot-middleware": "^2.21.2",
    "webpack-merge": "^4.1.2"
  }
}
  1. Отредактируйте webpack.config.vendor.js.
...
const nonTreeShakableModules = [
    '@angular-mdc/web',                         // add this line
//    'bootstrap',                              // remove this line
//    'bootstrap/dist/css/bootstrap.css',       // remove this line
    'es6-promise',
    'es6-shim',
    'event-source-polyfill',
    'jquery',
];
...

и

...
const sharedConfig = {
    stats: { modules: false },
    resolve: { extensions: ['.js'] },
    module: {
        rules: [
            { test: /\.(png|woff|woff2|eot|ttf|svg)(\?|$)/, use: 'url-loader?limit=100000' }
        ]
    },
    output: {
        publicPath: 'dist/',
        filename: '[name].js',
        library: '[name]_[hash]'
    },
    plugins: [
        new CleanWebpackPlugin([path.join(__dirname, 'ClientApp', 'dist'), path.join(__dirname, 'wwwroot', 'dist')]), // add this line
        new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery' }), // Maps these identifiers to the jQuery package (because Bootstrap expects it to be a global variable)
        new webpack.ContextReplacementPlugin(/\@angular\b.*\b(bundles|linker)/, path.join(__dirname, './ClientApp')), // Workaround for https://github.com/angular/angular/issues/11580
        // new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)@angular/, path.join(__dirname, './ClientApp')), // deactivate this line
        new webpack.ContextReplacementPlugin(/\@angular(\\|\/)core(\\|\/)esm5/, path.join(__dirname, './ClientApp')), // add this line
        new webpack.IgnorePlugin(/^vertx$/) // Workaround for https://github.com/stefanpenner/es6-promise/issues/100
    ]
};
...
  1. Отредактируйте webpack.config.js.
...
const merge = require('webpack-merge');
// const AotPlugin = require('@ngtools/webpack').AotPlugin; // remove this line
const AngularCompilerPlugin = require('@ngtools/webpack').AngularCompilerPlugin; // add this line
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin;
...

и

...
    const sharedConfig = {
        stats: { modules: false },
        context: __dirname,
        resolve: { extensions: [ '.js', '.ts' ] },
        output: {
            filename: '[name].js',
            publicPath: 'dist/' // Webpack dev middleware, if enabled, handles requests for this URL prefix
        },
        module: {
            rules: [
                { test: /\.ts$/, include: /ClientApp/, use: isDevBuild ? ['awesome-typescript-loader?silent=true', 'angular2-template-loader'] : '@ngtools/webpack' },
                { test: /\.html$/, use: 'html-loader?minimize=false' },
                { test: /\.css$/, use: ['to-string-loader', isDevBuild ? 'css-loader' : 'css-loader?minimize'] },
                // add scss loader
                {
                    test: /\.scss$/,
                    use: [
                        {
                            loader: 'file-loader',
                            options: {
                                name: 'bundle.css',
                            },
                        },
                        { loader: 'extract-loader' },
                        { loader: 'css-loader' },
                        { loader: 'sass-loader' },
                    ]
                },
                { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' }
            ]
        },
        plugins: [new CheckerPlugin()]
    };
...

и

...
            // Plugins that apply in production builds only
            new webpack.optimize.UglifyJsPlugin(),
            new AngularCompilerPlugin({                                     // replace AotPlugin with AngularCompilerPlugin
                tsConfigPath: './tsconfig.json',
                entryModule: path.join(__dirname, 'ClientApp/app/app.browser.module#AppModule'),
                exclude: ['./**/*.server.ts']
            })
...

и

...
        ].concat(isDevBuild ? [] : [
            // Plugins that apply in production builds only
            new AngularCompilerPlugin({                                     // replace AotPlugin with AngularCompilerPlugin
                tsConfigPath: './tsconfig.json',
                entryModule: path.join(__dirname, 'ClientApp/app/app.server.module#AppModule'),
                exclude: ['./**/*.browser.ts']
            })
        ]),
...
  1. Отредактируйте tsconfig.json для машинописного текста> = 2.7.2.
...

    "emitDecoratorMetadata": true,
    "strictPropertyInitialization": false, // add this line
    "skipDefaultLibCheck": true,
...
  1. Создайте ClientApp \ styles.scss с этой строкой
@import "~@angular-mdc/theme";      // Add this line
  1. Отредактируйте ClientApp / boot.browser.ts.
...
import 'reflect-metadata';
import 'zone.js';
//import 'bootstrap';   // deactivate this line
import './styles.scss'; // add this line
...
  1. Отредактируйте ClientApp / boot.server.ts.
...
return platformDynamicServer(providers).bootstrapModule(AppModule).then(moduleRef => {
    const appRef: ApplicationRef = moduleRef.injector.get(ApplicationRef);
    const state = moduleRef.injector.get(PlatformState);
    //const zone = moduleRef.injector.get(NgZone);              // deactivated this line
    const zone: NgZone = moduleRef.injector.get(NgZone);        // add this line

    return new Promise<RenderResult>((resolve, reject) => {

...
  1. Создайте ClientApp \ app \ app.module.mdc.ts.
import { NgModule } from '@angular/core';
import {
  MdcAppBarModule,
  MdcButtonModule,
  MdcCardModule,
  MdcCheckboxModule,
  MdcChipsModule,
  MdcDialogModule,
  MdcDrawerModule,
  MdcElevationModule,
  MdcFabModule,
  MdcFormFieldModule,
  MdcGridListModule,
  MdcIconModule,
  MdcIconToggleModule,
  MdcLinearProgressModule,
  MdcListModule,
  MdcMenuModule,
  MdcRadioModule,
  MdcRippleModule,
  MdcSelectModule,
  MdcSliderModule,
  MdcSnackbarModule,
  MdcSwitchModule,
  MdcTabModule,
  MdcTextFieldModule,
  MdcThemeModule,
  MdcToolbarModule,
  MdcTypographyModule,
} from '@angular-mdc/web';

@NgModule({
  exports: [
    MdcAppBarModule,
    MdcButtonModule,
    MdcCardModule,
    MdcCheckboxModule,
    MdcChipsModule,
    MdcDialogModule,
    MdcDrawerModule,
    MdcElevationModule,
    MdcFabModule,
    MdcFormFieldModule,
    MdcGridListModule,
    MdcIconModule,
    MdcIconToggleModule,
    MdcLinearProgressModule,
    MdcListModule,
    MdcMenuModule,
    MdcRadioModule,
    MdcRippleModule,
    MdcSelectModule,
    MdcSliderModule,
    MdcSnackbarModule,
    MdcSwitchModule,
    MdcTabModule,
    MdcTextFieldModule,
    MdcThemeModule,
    MdcToolbarModule,
    MdcTypographyModule,
  ]
})
export class MdcMaterialModule { }
  1. Измените app.shared.module.ts.
...
import { RouterModule } from '@angular/router';

import { MdcMaterialModule } from './app.module.mdc'; // Add this line

import { AppComponent } from './components/app/app.component';
...

и импортируйте его:

...
    imports: [
        CommonModule,
        HttpModule,
        FormsModule,
        MdcMaterialModule, // Add this line
        RouterModule.forRoot([
            { path: '', redirectTo: 'home', pathMatch: 'full' },
            { path: 'home', component: HomeComponent },
            { path: 'counter', component: CounterComponent },
            { path: 'fetch-data', component: FetchDataComponent },
            { path: '**', redirectTo: 'home' }
        ])
    ]
...
  1. Отредактируйте ClientApp \ app \ components \ app \ app.component.html.
<div class='container-fluid'>
    <div class='row'>
        <div class='col-sm-3'>
            <nav-menu></nav-menu>
        </div>
        <div class='col-sm-9 body-content'>
            <router-outlet></router-outlet>
        </div>
    </div>
    <!--Add this <a> Tag part-->
    <a mdc-button [primary]="true" [raised]="true">
        <i class="material-icons mdc-button__icon">add box</i>
        mdc Button
    </a>
    <!-- until here -->
</div>
  1. Очистить / Очистить / Удалить все содержимое в ClientApp \ app \ components \ navmenu \ navmenu.component.html. Это вызывает сбой в работе кнопок при изменении размера окна браузера.

  2. Отредактируйте Views \ Shared \ _Layout.cshtml.

...
    <base href="~/" />

    <!-- add this 2 lines -->
    <link href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i,700,700i" rel="stylesheet">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

    <!-- deactivated this line -->
    @*<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />*@

    <!-- add this line -->
    <link rel="stylesheet" href="~/dist/bundle.css" asp-append-version="true" />
...
  1. Отредактируйте Views \ Home \ Index.cshtml.
@{
    ViewData["Title"] = "Home Page";
}

<!-- deactivate this lines -->

@*<app asp-prerender-module="ClientApp/dist/main-server">Loading...</app>

    <script src="~/dist/vendor.js" asp-append-version="true"></script>
    @section scripts {
        <script src="~/dist/main-client.js" asp-append-version="true"></script>
    }*@

<!-- add this lines -->

<app>Loading...</app>

@section scripts {
    <script src="~/dist/vendor.js" asp-append-version="true"></script>
    <script src="~/dist/main-client.js" asp-append-version="true"></script>
}
  1. Сохраните все файлы и закройте VS2017
  2. Откройте командную строку Node.js и перейдите в каталог проекта (где находится package.json).
  3. rmdir / S node_modules (повторяйте, пока все не будет удалено)
  4. npm install
  5. npm запустить сборку: vd
  6. npm запустить сборку: dev
  7. Откройте VS2017 и проект
  8. Подождите, пока не будет выполнено восстановление npm (выберите вывод npm)

  9. Запустите решение (F5) и нажмите кнопку




Ответы (1)


Пара вариантов решения проблемы непрозрачности ряби. Понизьте версию node-sass до 4.7.2 или обновите angular-mdc / web до последней версии v0.34.1.

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

Надеюсь это поможет.

person trimox    schedule 09.04.2018
comment
Привет @trimox. Спасибо за ваш совет. Эффект пульсации теперь работает так же, как и должен, как вы описали с помощью node-sass 4.7.2 или mdc / web 0.34.1. Неважно, что изменится. Но есть проблема с размером окна (хром). Вен, я перемещаю окно для страницы. Он работает до тех пор, пока ширина окна не станет 769 пикселей. От 770px и выше я больше не могу нажимать кнопку. Пожалуйста, взгляните на мою демо-гифку. У вас тоже есть идея для этого? Спасибо. - person lod; 09.04.2018
comment
Добро пожаловать. Не могли бы вы вставить содержимое import './styles.scss';? - person trimox; 09.04.2018
comment
Это под пунктом №. 8. Это только одна строчка. @import "~@angular-mdc/theme"; - person lod; 09.04.2018
comment
Очень интересно. Я вижу, что рябь не работает на 769 пикселей, но реагирует ли кнопка на (click) события? Мне не удалось сделать копию с использованием существующего кода, поэтому, если проблема не исчезнет, ​​я пройдусь по вашим шагам и дам вам знать. - person trimox; 10.04.2018
comment
Его не исправить на 769 пикселей. Иногда тоже на 768. Но я не могу узнать, когда он изменится. Кажется, случайно. Это не начальный размер браузера и не разрешение монитора (я работаю в виртуальной машине, где я могу уменьшить размер). И нет, отсутствие пульсации означает также отсутствие событий щелчка. В angular-mdc / web v0.33.1 иногда пространство для щелчка смещается вправо. Таким образом, я мог нажимать только на левую часть кнопки, но не на правую. С v0.34.1 этого переключения больше не происходит. Он ведет себя как описано. Дай мне знать, когда я смогу помочь. - person lod; 10.04.2018
comment
Я создам репозиторий git. Подождите с воспроизведением. Думаю, тебе легче. Дайте мне день (я новичок в этом). - person lod; 10.04.2018
comment
Взгляните на репозиторий git: github.com/lod911/vs2017 -Angluar-Template-with-mdc-web Надеюсь, вы найдете причину. - person lod; 10.04.2018
comment
@lod хорошие новости. Нет ничего плохого в использовании MDC, проблема в div панели навигации. Оскорбительный div - <div class="navbar navbar-inverse">, и он как бы перекрывает кнопку, когда достигается точка останова. - person trimox; 12.04.2018
comment
Большой! Большое спасибо за ваше расследование! Я отредактировал свой пост и изменил также свой репозиторий ... на случай, если кто-то его найдет, может быть, это поможет. - person lod; 12.04.2018