Пользовательский фильтр не работает в угловой гибридного приложения


Я пытаюсь преобразовать приложение AngularJS 1.6 в гибридное приложение Вместе с Angular 5. У меня есть следующий простой фильтр:

(function () {
    "use strict";
    var filterId = "colorPicker";

    angular
        .module('app')
        .filter('colorPicker', colorPicker);

    function colorPicker() {
        return function (input) {
            var colorCode = '#2980b9';
            switch (input) {
                case 1:
                    colorCode = '#16a085';
                    break;
                case 2:
                    colorCode = '#a38761';
                    break;
                case 3:
                    colorCode = '#8e44ad';
                    break;
                case 4:
                    colorCode = '#ffa800';
                    break;
                case 5:
                    colorCode = '#d95459';
                    break;
                case 6:
                    colorCode = '#8eb021';
                    break;
                default:
            }
            return colorCode;
        };
    }
})();

Фильтр используется следующим образом: ng-attr-style="background-color: {{ $index | colorPicker }}"

Это работает в приложении AngularJS, но я получаю следующую ошибку в гибридном приложении: angular.js:14525 Error: [$injector:unpr] Unknown provider: colorPickerFilterProvider <- colorPickerFilter

Фильтр вызывается из кода AngularJS, как и раньше. На самом деле, у меня почти нет углового кода 5. Я просто пытаюсь заставить существующий код работать так, как он был, но в пределах Гибридное приложение. Разве я не могу использовать фильтры, как раньше?

Обновить

Я думаю, что это может быть связано с другими ошибками, которые я получаю о контроллерах:

[$controller:ctrlreg] The controller with the name 'myController' is not registered.

Я вижу, что файлы скрипта загружаются успешно, и никаких ошибок не возникает, когда мой app.module.ts bootstraps AngularJS. На самом деле, я несколько уверен, что AngularJS работает, так как он получал ошибку о том, что globalVars не вводится (это было определено в представлении razor, которое я больше не используется), но ошибка исчезла после того, как я воссоздал его в TypeScript и "понизил" его, чтобы AngularJS мог использовать его.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { FormsModule } from '@angular/forms';
import { downgradeInjectable, UpgradeModule } from '@angular/upgrade/static';

import { AppComponent } from './app.component';
import { GlobalVarsService } from './core/global-vars.service';

declare var angular: any;

angular.module('app', []).factory('globalVars', downgradeInjectable(GlobalVarsService));

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpClientModule,
    UpgradeModule
  ],
  providers: [
    GlobalVarsService
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
  constructor(private upgrade: UpgradeModule) {
    this.upgrade.bootstrap(document.body, ['app'], { strictDi: true });
  }
}

Таким образом, файлы загружаются и выполняются, но контроллеры и фильтр (и, возможно, другие элементы) не найдены приложением. Я поместил весь старый код в папку с именем "old", а затем обновил .angular-cli.json, чтобы скопировать эти файлы в выходные данные при сборке, чтобы я мог ссылаться на них через теги <script> в индексе.формат html. Это должно сработать, не так ли? Или сделать файлы нужно быть в комплекте с файлами Angular 5 по какой-то причине?

// .angular-cli.json section
  "assets": [
    "assets",
    { "glob": "**/*", "input": "../old/app/", "output": "./app/" },
    { "glob": "**/*", "input": "../old/Content/", "output": "./Content/" },
    { "glob": "**/*", "input": "../old/Scripts/", "output": "./Scripts/" },
    "favicon.ico"
  ], 
1 2

1 ответ:

Нашел проблему. На самом деле я думаю, что было две проблемы. Во-первых, я думаю, что я переопределяю "приложение", включая квадратные скобки при понижении моей службы globalVars.

angular.module('app', []).factory('globalVars', downgradeInjectable(GlobalVarsService));

Вместо

angular.module('app').factory('globalVars', downgradeInjectable(GlobalVarsService));

Другой проблемой, я думаю, была проблема курицы и яйца. Мой globalVars был введен в функцию конфигурации моего приложения AngularJS, но я думаю, что приложение, возможно, было необходимо понизить globalVars - все еще не совсем уверен. К счастью для я, ничто не ссылалось globalVars в моем app.js, поэтому я смог удалить ссылку.

Это версия моего app.module.ts, которая наконец-то заработала. Надеюсь, это поможет кому-то еще!

import { NgModule, APP_INITIALIZER } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
import { HttpClient } from '@angular/common/http';
import { downgradeInjectable, UpgradeModule } from '@angular/upgrade/static';
import { environment } from '../environments/environment';

import { AppComponent } from './app.component';
import { GlobalVarsService } from './core/global-vars.service';

declare var angular: any;

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    UpgradeModule
  ],
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: OnAppInit,
      multi: true,
      deps: [GlobalVarsService, HttpClient]
    },
    GlobalVarsService
  ]
})
export class AppModule {
  constructor(private upgrade: UpgradeModule, private http: HttpClient) { }
  ngDoBootstrap() {
    angular.module('app').factory('globalVars', downgradeInjectable(GlobalVarsService));
    this.upgrade.bootstrap(document.body, ['app'], { strictDi: true });
  }
}

export function OnAppInit(globalVars: GlobalVarsService, http: HttpClient) {
  return (): Promise<any> => {
    return new Promise((resolve, reject) => {
      // Fetch data from the server before initializing the app.
      http.get(environment.apiBase + '/api/meta/data').subscribe(x => {
        globalVars.MetaData = x;
        globalVars.VersionNumber = globalVars.MetaData.versionNumber;
        globalVars.IsDebugBuild = globalVars.MetaData.isDebugBuild;
        globalVars.AuthorizedFeatures = globalVars.MetaData.authorizedFeatures;
        globalVars.User = globalVars.MetaData.user;
        resolve();
      });
    });
  };
}