Angularjs 2 — обновление шаблона или компонента не обновляет пользовательский интерфейс

Я исхожу из фона angular 1, где все работало так гладко, и у меня были серьезные проблемы, даже если базовое приложение работало в Visual Studio с angular 2. Я создал пустой проект в визуальной студии и очень внимательно следовал «5-минутному учебнику». Дошло до того, что он наконец начал работать, но я заметил проблему с обновлением пользовательского интерфейса, когда я меняю шаблон в app.component.ts, в браузере ничего не отображается. Я перезапустил и повторно запустил файлы, но в браузере все еще отображается старый вывод.

Ниже приведен мой код:

In tsconfig.json

{
  "compileOnSave": true,
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [ "es2015", "dom" ],
    "noImplicitAny": true,
    "suppressImplicitAnyIndexErrors": true
  }
}

Systemjs.config.js:

/**
 * System configuration for Angular samples
 * Adjust as necessary for your application needs.
 */
(function (global) {
  System.config({
    paths: {
      // paths serve as alias
      'npm:': 'node_modules/'
    },
    // map tells the System loader where to look for things
    map: {
      // our app is within the app folder
      app: 'app',

      // angular bundles
      '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
      '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
      '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
      '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
      '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
      '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
      '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
      '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',

      // other libraries
      'rxjs':                      'npm:rxjs',
      'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js'
    },
    // packages tells the System loader how to load when no filename and/or no extension
    packages: {
      app: {
        main: './main.js',
        defaultExtension: 'js'
      },
      rxjs: {
        defaultExtension: 'js'
      }
    }
  });
})(this);

Мой index.html имеет следующее содержимое

<!DOCTYPE html>
<html>
  <head>
    <title>Angular QuickStart</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="styles.css">

      <!-- Polyfill(s) for older browsers -->
    <script src="node_modules/core-js/client/shim.min.js"></script>
    <script src="node_modules/zone.js/dist/zone.js"></script>
    <script src="node_modules/reflect-metadata/Reflect.js"></script>
    <script src="node_modules/systemjs/dist/system.src.js"></script>

    <script src="systemjs.config.js"></script>
    <script>
      System.import('app').catch(function(err){ console.error(err); });
    </script>
  </head>

  <body>
    <my-app>Loading</my-app>
  </body>
</html>

В app.module.ts у меня есть

import { NgModule }      from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { AppComponent }  from "./app.component";
@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})

export class AppModule { }

In app.component.ts:

import { Component } from "@angular/core";
@Component({
    selector: "my-app",
    template: "<h2>Initiating {{angularVersion}}</h2>"
})
export class AppComponent {
    angularVersion = "Angular2.0";
}

и, наконец, в main.ts у меня есть:

import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
import { AppModule } from "./app.module";
platformBrowserDynamic().bootstrapModule(AppModule);

Это отображает вывод как "Initiating Angular2.0", когда я устанавливаю index.html в качестве файла запуска в Visual Studio 2015 и запускаю проект. Моя проблема в том, что даже если я обновлю переменную angularVersion до 2.1 или изменю что-нибудь еще (с h2 на p и т. д.) и перезапущу файл, он все равно представит мне "Initiating Angular2.0". Даже жесткое кодирование Template ничего не обновит. Я понятия не имею, что я делаю неправильно, но сейчас это начало сильно расстраивать. Любая помощь, пожалуйста?


person Ali Baig    schedule 19.12.2016    source источник
comment
Вы уверены, что ваши файлы ts компилируются заново после сохранения? Вы просто можете проверить свой app.component.js файл   -  person yurzui    schedule 19.12.2016
comment
удалите все файлы js (скомпилированные в папке приложения) и попробуйте   -  person anshuVersatile    schedule 19.12.2016
comment
Как ни странно, когда я запускаю его с помощью «npm start», он работает! Но когда я запускаю из визуальной студии, компилятор машинописного текста не генерирует обновленный (скомпилированный) javascript   -  person Ali Baig    schedule 19.12.2016


Ответы (2)


Нажмите F12 в браузере, чтобы открыть инструменты разработчика. Отключите кеш, как показано ниже.

введите здесь описание изображения

Во-вторых, мне пришлось добавить этот раздел чуть выше тега в web.config, чтобы отключить кеш.

<location path="app">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="DisableCache"/>
      </staticContent>
    </system.webServer>
</location>

Источник: см. здесь

person Ali Baig    schedule 26.12.2016
comment
Как это должно работать в производственном режиме? С одной стороны, мы не можем просить пользователей изменить настройки браузера, а с другой — сохранять кэширование. - person user1595443; 18.03.2017

Я изменил в tsconfig.json:

compileOnSave значение от false до true, и это сработало для меня.

person DNK    schedule 21.11.2017