首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OverlayModule (angular2-Matter)在Angular2应用程序中的应用

OverlayModule (angular2-Matter)在Angular2应用程序中的应用
EN

Stack Overflow用户
提问于 2016-09-24 14:06:42
回答 2查看 3.4K关注 0票数 3

注意:我不使用角-Cli

OverlayModule似乎是其他安圭拉2-材料组件所必需的。

zone.js:355未处理的承诺拒绝:./AppComponent类AppComponent中的错误-内联模板:2:2由以下原因引起:无覆盖提供程序!;区域:;任务: Promise.then;值:

我已经安装了所有的包装从安古拉2-材料。

sytemjs.config.js

代码语言:javascript
复制
 map: {
      // our app is within the app folder
      app: 'dist',
      ...
      ...
      '@angular2-material/core': 'npm:@angular2-material/core/core.umd.js',
      '@angular2-material/button': 'npm:@angular2-material/button/button.umd.js',
      '@angular2-material/menu': 'npm:@angular2-material/menu/menu.umd.js',
      '@angular2-material/icon': 'npm:@angular2-material/icon/icon.umd.js',
      _____________________________________________________________________
      /*>>>>>   DO I NEED TO MAP ANYTHING FOR OVERLAY HERE?  <<<<<< */
      ______________________________________________________________________
      // other libraries
      'rxjs':                       'npm:rxjs',
      'angular2-in-memory-web-api': 'npm:angular2-in-memory-web-api',
    },

我正在使用sharedModule作为angular2材料组件,这样它们就可以在任何地方使用。

shared.module.ts

代码语言:javascript
复制
import {MdButtonModule } from '@angular2-material/button';
import {MdIconModule} from '@angular2-material/icon';
import {MdMenuModule} from '@angular2-material/menu';
import {MdIconRegistry} from '@angular2-material/icon';

@NgModule({
  imports:      [ CommonModule ],
  declarations: [],
  exports:      [ CommonModule,MdButtonModule,MdMenuModule,MdIconModule],
})
export class SharedModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: SharedModule,
      providers: [ MdIconRegistry ]  //>>>>> DO I NEED TO ADD ANYTHING HERE ??
    };
  }
}

App.Module.ts

代码语言:javascript
复制
@NgModule({
  imports:      [ BrowserModule,SharedModule.forRoot()],  
  ...
})

HTML:

代码语言:javascript
复制
<button md-icon-button [md-menu-trigger-for]="menu">
   <md-icon>more_vert</md-icon>
</button>

<md-menu #menu="mdMenu">
    <button md-menu-item> Refresh </button>
    <button md-menu-item> Settings </button>
    <button md-menu-item> Help </button>
    <button md-menu-item disabled> Sign Out </button>
</md-menu>
<button md-raised-button>Button</button>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-24 14:50:08

有几种选择:

  • 1)尝试在共享模块中导入OverlayModule,如下所示:

shared.module.ts

代码语言:javascript
复制
import {OverlayModule } from '@angular2-material/core';
@NgModule({
  imports:      [ CommonModule, OverlayModule.forRoot() ], <== here
  declarations: [],
  exports:      [ CommonModule,MdButtonModule,MdMenuModule,MdIconModule],
})
export class SharedModule {
  • 2)可以在主模块中导入
  • ( 3)或使用下列方法:

shared.module.ts

代码语言:javascript
复制
static forRoot(): ModuleWithProviders {
  return {
    ngModule: SharedModule,
      [ MdIconRegistry,  MdMenuModule.forRoot().providers ]
  };
}

柱塞实例

  • ( 4)或以这种方式:

shared.module.ts

代码语言:javascript
复制
@NgModule({
  imports:      [ CommonModule, MdMenuModule.forRoot() ],
  declarations: [],
  exports:      [ CommonModule,MdButtonModule,MdMenuModule,MdIconModule],
})
  • 5)只需将提供程序添加到您的SharedModule

shared.module.ts

代码语言:javascript
复制
 import {OVERLAY_PROVIDERS } from '@angular2-material/core';
 return {
   ngModule: SharedModule,
   providers: [ MdIconRegistry,  OVERLAY_PROVIDERS ]
 };

forRoot()总是返回ModuleWithProviders对象:

代码语言:javascript
复制
export interface ModuleWithProviders {
  ngModule: Type<any>;
  providers?: Provider[];
}

export class MdMenuModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: MdMenuModule,
      providers: OVERLAY_PROVIDERS,
    };
  }
}

https://github.com/angular/material2/blob/2.0.0-alpha.8/src/lib/menu/menu.ts#L21

票数 4
EN

Stack Overflow用户

发布于 2016-09-24 15:43:45

只是为了添加到接受答案中。

首先要提到的是,由于提到forRoot()的原因,不应该将这里导入共享模块。现在,应该从其中提取提供程序以添加共享模块@NgModule.providers

代码语言:javascript
复制
@NgModule({
  imports: [ SomeModule.forRoot() ],
  providers: [ SomeModule.forRoot().providers ]
})
export class SharedModule {}

这两样都别做。不是在共享模块中。下面是好的,虽然我不认为它是这样使用的

代码语言:javascript
复制
@NgModule({})
export class SharedModule {
  static forRoot() {
    return {
      ngModule: SharedModule,
      providers: [ SomeModule.forRoot().providers ]
    }
  }
}

就像我说的,没事的,会有用的,但看起来很奇怪。也许一个更优雅的解决方案是由物质本身提供的。您可以查看快照(现在--将在下一个版本中),您将看到他们在哪里制作了一个模块,合并了所有MD模块。也许只是做他们正在做的事情,但是不要添加所有的模块,只需添加您使用的模块。

代码语言:javascript
复制
const MATERIAL_MODULES = [
  MdButtonModule,
  MdIconModule,
  MdMenuModule
];

@NgModule({
  imports: [
    MdButtonModule.forRoot(),
    MdIconModule.forRoot(),
    MdMenuModule.forRoot()
  ],
  exports: MATERIAL_MODULES
})
export class MaterialRootModule {}

@NgModule({
  imports: MATERIAL_MODULES,
  exports: MATERIAL_MODULES
})
export class MaterialModule {
  static forRoot() {
    ngModule: MaterialRootModule
  }
}

在你的共享模块里

代码语言:javascript
复制
exports: [ MaterialModule ]

在应用程序模块中

代码语言:javascript
复制
imports: [ MaterialModule.forRoot() ]

就风格而言,我想我可能会走这条路。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39677232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档