自定义过滤器在 Angular 混合应用程序中不起作用
Custom filter not working in Angular Hybrid app
我正在尝试将 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 代码中调用的,就像以前一样。事实上,我几乎没有任何 Angular 5 代码。我只是想将现有代码按原样添加到 运行,但在 Hybrid 应用程序中。我不能像以前那样使用过滤器吗?
更新
我认为这可能与我遇到的有关控制器的其他错误有关:
[$controller:ctrlreg] The controller with the name 'myController' is not registered.
我可以看到脚本文件下载成功,并且当我的 app.module.ts
引导 AngularJS 时没有抛出任何错误。事实上,我有点确定 AngularJS 是 运行ning,因为它收到关于 globalVars
未被注入的错误(这是在剃刀视图中定义的,我不是不再使用)但是在我用 TypeScript 重新创建它并 "downgraded" 它之后错误消失了,所以 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
以在构建时将这些文件复制到输出,以便我可以通过 [=43] 中的 <script>
标记引用它们=].这应该行得通,不是吗?或者出于某种原因这些文件是否需要与 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"
],
找到问题了。其实我觉得有两个问题。一是我认为我在降级 globalVars
服务时通过包含方括号来 重新定义 "app"。
angular.module('app', []).factory('globalVars', downgradeInjectable(GlobalVarsService));
而不是
angular.module('app').factory('globalVars', downgradeInjectable(GlobalVarsService));
我认为另一个问题是先有鸡还是先有蛋的问题。我的 globalVars
被注入到我的 AngularJS 应用程序的配置函数中,但我认为该应用程序可能需要降级 globalVars
- 仍然不完全确定。对我来说幸运的是,我的 app.js
中没有任何内容引用 globalVars
,所以我能够删除引用。
这是我的 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();
});
});
};
}
我正在尝试将 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 代码中调用的,就像以前一样。事实上,我几乎没有任何 Angular 5 代码。我只是想将现有代码按原样添加到 运行,但在 Hybrid 应用程序中。我不能像以前那样使用过滤器吗?
更新
我认为这可能与我遇到的有关控制器的其他错误有关:
[$controller:ctrlreg] The controller with the name 'myController' is not registered.
我可以看到脚本文件下载成功,并且当我的 app.module.ts
引导 AngularJS 时没有抛出任何错误。事实上,我有点确定 AngularJS 是 运行ning,因为它收到关于 globalVars
未被注入的错误(这是在剃刀视图中定义的,我不是不再使用)但是在我用 TypeScript 重新创建它并 "downgraded" 它之后错误消失了,所以 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
以在构建时将这些文件复制到输出,以便我可以通过 [=43] 中的 <script>
标记引用它们=].这应该行得通,不是吗?或者出于某种原因这些文件是否需要与 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"
],
找到问题了。其实我觉得有两个问题。一是我认为我在降级 globalVars
服务时通过包含方括号来 重新定义 "app"。
angular.module('app', []).factory('globalVars', downgradeInjectable(GlobalVarsService));
而不是
angular.module('app').factory('globalVars', downgradeInjectable(GlobalVarsService));
我认为另一个问题是先有鸡还是先有蛋的问题。我的 globalVars
被注入到我的 AngularJS 应用程序的配置函数中,但我认为该应用程序可能需要降级 globalVars
- 仍然不完全确定。对我来说幸运的是,我的 app.js
中没有任何内容引用 globalVars
,所以我能够删除引用。
这是我的 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();
});
});
};
}