【问题标题】:Custom filter not working in Angular Hybrid app自定义过滤器在 Angular Hybrid 应用程序中不起作用
【发布时间】:2017-12-28 21:05:28
【问题描述】:

我正在尝试将 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 代码。我只是想让现有代码像以前一样运行,但在混合应用程序中。我不应该像以前一样使用过滤器吗?

更新

我认为这可能与我遇到的关于控制器的其他错误有关:

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

我可以看到脚本文件下载成功,并且当我的app.module.ts 引导 AngularJS 时没有抛出任何错误。事实上,我有点确定 AngularJS 正在运行,因为它收到关于 globalVars 未注入的错误(这是在我不再使用的剃刀视图中定义的)但在我重新创建后错误消失了在 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 以在构建时将这些文件复制到输出中,以便我可以通过 index.html 中的<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"
  ], 

【问题讨论】:

    标签: javascript angularjs angular-filters angular5 multi-device-hybrid-apps


    【解决方案1】:

    发现问题。其实我觉得有两个问题。一个是我认为我在降级我的globalVars 服务时通过包含方括号重新定义“应用程序”。

    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();
          });
        });
      };
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      相关资源
      最近更新 更多