如何使 PrimeNG 菜单栏组件工作?

Posted

技术标签:

【中文标题】如何使 PrimeNG 菜单栏组件工作?【英文标题】:How to make PrimeNG Menubar component work? 【发布时间】:2016-10-25 03:42:17 【问题描述】:

我正在尝试使用 PrimeNG 制作菜单栏,基于来自 http://www.primefaces.org/primeng/#/menubar 的示例

我创造了这样的东西:

app.component.ts

import Component from '@angular/core';
import MenuBarComponent from "./menubardemo.component";
@Component(
  selector: 'my-app',
  template: `<h1>My First Angular 2 App</h1><demo></demo>`,
  directives:[MenuBarComponent] )
export class AppComponent  

menubardemo.components.ts

import Component, OnInit from "@angular/core";
import Menubar, MenuItem from "primeng/primeng";
@Component(
  selector: 'demo',
  template: `<p-menubar [model]="items"> </p-menubar>`,
  directives: [Menubar] )
export class MenuBarComponent implements OnInit 
  private items:MenuItem[];// you know how to fill this in the "OnInit" method

  ngOnInit() 
    this.items = [
      
        label: 'File',
        icon: 'fa-file-o',
        items: [
          label: 'New',
          icon: 'fa-plus',
          items: [
            label: 'Project',
            label: 'Other',
          ]
        ,
          label: 'Open',
          label: 'Quit'
        ]
      ,
      
        label: 'Edit',
        icon: 'fa-edit',
        items: [
          label: 'Undo', icon: 'fa-mail-forward',
          label: 'Redo', icon: 'fa-mail-reply'
        ]
      ,
      
        label: 'Help',
        icon: 'fa-question',
        items: [
          
            label: 'Contents'
          ,
          
            label: 'Search',
            icon: 'fa-search',
            items: [
              
                label: 'Text',
                items: [
                  
                    label: 'Workspace'
                  
                ]
              ,
              
                label: 'File'
              
            ]
          
        ]
      ,
      
        label: 'Actions',
        icon: 'fa-gear',
        items: [
          
            label: 'Edit',
            icon: 'fa-refresh',
            items: [
              label: 'Save', icon: 'fa-save',
              label: 'Update', icon: 'fa-save',
            ]
          ,
          
            label: 'Other',
            icon: 'fa-phone',
            items: [
              label: 'Delete', icon: 'fa-minus'
            ]
          
        ]
      ,
      
        label: 'Quit', icon: 'fa-minus'
      
    ];
  

在我检查出数据对象后打印在 DOM 上,但菜单栏没有显示。

更新:

index.html

<html>
  <head>
    <title>Angular 2 QuickStart</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" type="text/css" href="node_modules/primeui/themes/omega/theme.css" />
    <link rel="stylesheet" type="text/css" href="node_modules/font-awesome/css/font-awesome.min.css">
    <link rel="stylesheet" type="text/css" href="node_modules/primeui/primeui-ng-all.min.css" />
    <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="node_modules/primeui/primeui-ng-all.min.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>

package.json


  "name": "angular2-quickstart",
  "version": "1.0.0",
  "description": "QuickStart package.json from the documentation, supplemented with testing support",
  "scripts": 
    "start": "tsc && concurrently \"tsc -w\" \"lite-server\" ",
    "docker-build": "docker build -t ng2-quickstart .",
    "docker": "npm run docker-build && docker run -it --rm -p 3000:3000 -p 3001:3001 ng2-quickstart",
    "pree2e": "npm run webdriver:update",
    "e2e": "tsc && concurrently \"http-server\" \"protractor protractor.config.js\"",
    "lint": "tslint ./app/**/*.ts -t verbose",
    "lite": "lite-server",
    "postinstall": "typings install",
    "test": "tsc && concurrently \"tsc -w\" \"karma start karma.conf.js\"",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings",
    "webdriver:update": "webdriver-manager update"
  ,
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": 
      "@angular/common":  "2.0.0-rc.1",
      "@angular/compiler":  "2.0.0-rc.1",
      "@angular/core":  "2.0.0-rc.1",
      "@angular/http":  "2.0.0-rc.1",
      "@angular/platform-browser":  "2.0.0-rc.1",
      "@angular/platform-browser-dynamic":  "2.0.0-rc.1",
      "@angular/router":  "2.0.0-rc.1",
      "@angular/router-deprecated":  "2.0.0-rc.1",
      "@angular/upgrade":  "2.0.0-rc.1",
      "systemjs": "0.19.27",
      "es6-shim": "^0.35.0",
      "reflect-metadata": "^0.1.3",
      "rxjs": "5.0.0-beta.6",
      "zone.js": "^0.6.12",
      "angular2-in-memory-web-api": "0.0.7",
      "primeng": "1.0.0-beta.7",
      "primeui": "4.1.12"
  ,
  "devDependencies": 
    "concurrently": "^2.0.0",
    "lite-server": "^2.2.0",
    "typescript": "^1.8.10",
    "typings": "^1.0.4",
    "canonical-path": "0.0.2",
    "http-server": "^0.9.0",
    "tslint": "^3.7.4",
    "lodash": "^4.11.1",
    "jasmine-core": "~2.4.1",
    "karma": "^0.13.22",
    "karma-chrome-launcher": "^0.2.3",
    "karma-cli": "^0.1.2",
    "karma-htmlfile-reporter": "^0.2.2",
    "karma-jasmine": "^0.3.8",
    "protractor": "^3.3.0",
    "rimraf": "^2.5.2"
  ,
  "repository": 

tsconfig.json


  "compilerOptions": 
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": true,
    "suppressImplicitAnyIndexErrors": true
  

systemjs.config.js

/**
 * System configuration for Angular 2 samples
 * Adjust as necessary for your application needs.
 */
(function (global) 

  // map tells the System loader where to look for things
  var map = 
    'app': 'app', // 'dist',

    '@angular': 'node_modules/@angular',
    'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
    'rxjs': 'node_modules/rxjs',
    'primeng': 'node_modules/primeng'
  ;

  // packages tells the System loader how to load when no filename and/or no extension
  var packages = 
    'app': main: 'main.js', defaultExtension: 'js',
    'rxjs': defaultExtension: 'js',
    'angular2-in-memory-web-api': main: 'index.js', defaultExtension: 'js',
    'primeng': defaultExtension: 'js'
  ;

  var ngPackageNames = [
    'common',
    'compiler',
    'core',
    'forms',
    'http',
    'platform-browser',
    'platform-browser-dynamic',
    'router',
    'router-deprecated',
    'upgrade',
  ];

  // Individual files (~300 requests):
  function packIndex(pkgName) 
    packages['@angular/' + pkgName] = main: 'index.js', defaultExtension: 'js';
  

  // Bundled (~40 requests):
  function packUmd(pkgName) 
    packages['@angular/' + pkgName] = main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js';
  

  // Most environments should use UMD; some (Karma) need the individual index files
  var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;

  // Add package entries for angular packages
  ngPackageNames.forEach(setPackageConfig);

  // No umd for router yet
  packages['@angular/router'] = main: 'index.js', defaultExtension: 'js';

  var config = 
    map: map,
    packages: packages
  ;

  System.config(config);

)(this);

typings.json


  "globalDependencies": 
    "angular-protractor": "registry:dt/angular-protractor#1.5.0+20160425143459",
    "core-js": "registry:dt/core-js#0.0.0+20160602141332",
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
    "node": "registry:dt/node#6.0.0+20160621231320",
    "selenium-webdriver": "registry:dt/selenium-webdriver#2.44.0+20160317120654"
  

【问题讨论】:

可以分享你的html代码吗? 好的,我更新它... 你解决了吗?? 不...仍然无法正常工作... 【参考方案1】:

这可能会对某些人有所帮助。就我而言,我忘记在 angular.json 文件中添加库

第1步:在app.module.ts代码中:

@NgModule(
    declarations: [AppComponent, HeaderComponent, MenubarComponent],
    imports: [
        BrowserModule,
        BrowserAnimationsModule,
        AppRoutingModule,
        MenuModule,
        MenubarModule,
        BreadcrumbModule,
    ],

 注意:确保你已经添加了菜单栏模块并像下面这样导入它

import  MenubarModule  from 'primeng/menubar';

第 2 步:如果您在单独的组件中有菜单栏

export class MenubarComponent implements OnInit 
    items: MenuItem[];

并确保您有以下导入

import  MenuItem  from 'primeng/api';

第 3 步:这对我来说是缺少的部分。如果你做了primeng的npm安装,那么在

在 angular.json 文件中:确保你有必要的primeng库,如下所示

在架构师下构建

"styles": [
                        "node_modules/primeicons/primeicons.css",
                        "node_modules/primeng/resources/themes/nova-light/theme.css",
                        "node_modules/primeng/resources/primeng.min.css",   
                        "src/styles.scss"
                    ],

这肯定会显示菜单栏

【讨论】:

【参考方案2】:

我只是想通了,我相信。

需要在app.module.ts中导入MenuModule

//app.module.ts
import  BrowserModule  from '@angular/platform-browser';
import  NgModule  from '@angular/core';
import  FormsModule  from '@angular/forms';
import  HttpModule  from '@angular/http';
import MenuModule from 'primeng/primeng';



import  AppComponent  from './app.component';

@NgModule(
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    MenuModule
  ],
  providers: [],
  bootstrap: [AppComponent]
)
export class AppModule  

这应该可以解决您的问题。

【讨论】:

【参考方案3】:

我遇到了类似的问题。在我的情况下,我的应用程序没有使用路由,但 PrimeNG 仍然需要它。有一个开放的request 使路由器成为可选的,但 PrimeNG 没有对此做出回应。所以我创建了自己的路由器服务:

export class Router

   constructor()
   public navigate(route: any[]):void
   
       // Do nothing
   

然后我修改了我的systemjs.config.js 以将@angular/router 指向我的新路由器。这很好用,我可以在不需要路由器的情况下使用该组件。

【讨论】:

【参考方案4】:

查看错误“No provider for Router”看起来像是 PrimeNG 组件没有配置 angular2 路由器的问题,但我没有确认,如果有人深入研究这个就好了。

反正我遇到了这个问题,添加了一些基本的路由就可以了,所以我分享一下,应该是这样的:

ma​​in.ts

import  bootstrap     from '@angular/platform-browser-dynamic';
import  AppComponent  from './app.component';

import  provide  from '@angular/core';
import  APP_ROUTER_PROVIDERS  from './app.routes';
import APP_BASE_HREF from '@angular/common';

bootstrap(AppComponent, [APP_ROUTER_PROVIDERS,provide(APP_BASE_HREF, useValue : '/' )]);

app.component.ts

import  Component  from '@angular/core';
import MenuBarComponent from "./menubardemo.component";
import ROUTER_DIRECTIVES from '@angular/router';

@Component(
  selector: 'my-app',
  directives: [ROUTER_DIRECTIVES, MenuBarComponent],
  template: `
    <h1>My First Angular 2 App</h1>
    <demo></demo>
    <div>
      <router-outlet></router-outlet>
    </div>     
  `
)
export class AppComponent  

新:app.routes.ts

import provideRouter,RouterConfig from '@angular/router';
import ContentComponent from './content.component'

export const routes: RouterConfig = [
    path: '', component: ContentComponent
];

export const APP_ROUTER_PROVIDERS = [
  provideRouter(routes)
];

新:content.component.ts(默认组件)

import  Component  from '@angular/core';

@Component(
  selector: 'content',
  template: '<div><p>This is some content</p></div>'
)
export class ContentComponent  

【讨论】:

【参考方案5】:

我有同样的问题,到处搜索,即使在这个帖子中,我也能够解决它,只需配置一个简单的空路由:

app.module.ts

import  RouterModule    from '@angular/router';

@NgModule(
...
imports: [ RouterModule.forRoot([]), ... ]
...
)

index.html:

<script>document.write('<base href="' + document.location + '" />');</script>

【讨论】:

app.module.ts进行上述修改对我有用。【参考方案6】:

我遇到了同样的问题。 我就是无法从primeng/primeng导入MenuItem,我什至试图搜索界面在哪里, 实际上它位于“common”文件夹中,在primeng 17版中,该文件名为 api.d.ts ,我试图复制 接口声明并在我的菜单中使用它,但现在我只是在等待解决方案。 同时你可以试试这个,它会起作用,只需将项目声明为任何类型。

      private items: any[];

就是这样。

【讨论】:

【参考方案7】:

在这种情况下文档并不完整,你可以看一下源代码,你会发现一个更完整的例子:https://github.com/primefaces/primeng/tree/master/showcase/demo/menubar

鉴于 angular2 是基于组件的,最好将菜单栏提取到一个组件中,然后您可以从 AppComponent 中引用它。为此,您首先需要为您的组件创建一个单独的 Typescript 文件,在本例中为 menubardemo.component.ts

然后你需要像这样将@Component 添加到MenubarDemoComponent

import Component, OnInit from "@angular/core";
import Menubar, MenuItem from "primeng/primeng";
@Component(
    selector: 'demo',
    template: `<p-menubar [model]="items"> </p-menubar>`,
    directives: [Menubar] )
export class MenuBarComponent implements OnInit      
    private items:MenuItem[];// you know how to fill this in the "OnInit" method

然后像这样将它添加到AppComponent

import Component from '@angular/core'; 
import MenuBarComponent from "./menubardemo.component"; 
@Component(   
    selector: 'my-app',   
    template: `<h1>My First Angular 2 App</h1><demo></demo>`,
    directives:[MenuBarComponent] ) 
export class AppComponent  

要记住的重要一点:总是使用“`”(反引号) 直接在组件的定义中创建模板,您正在使用 “'”(单引号)并且不正确(如果您的 html 需要更多行,请考虑将其提取到其他文件中)。

您正在实例化组件:items = new MenubarDemo(),这也是不正确的,因为组件是 自动为你注入,只在 directives 字段。

【讨论】:

一个特别的错误?,你能添加你的代码的更新版本吗?? 我遵循你的方法,它显示一些错误“zone.js:461 未处理的承诺拒绝:异常:./Menubar 类菜单栏出错 - 内联模板:3:12 原始异常:没有路由器提供程序!”我的代码有问题吗? 哦,这看起来像是另一个问题,试试这个前段时间对我有用的解决方案:***.com/questions/34535163/…,让我知道它是否有效 如果你能用你所有的代码更新你的问题,我真的很感激,我会更容易帮助你。 是的,您应该添加我链接的答案中的更改(基本标签+引导中的附加配置)【参考方案8】:

尝试同时导入 Menubar 和 MenuItem

import Menubar,MenuItem from 'primeng/primeng';

根据您的 menubardemo.components.ts,您只使用了 MenuItem。

【讨论】:

@zho PrimeNG MenuBar 运气好吗?【参考方案9】:

浏览器控制台中的任何错误?如果有,请发帖。

我认为您需要将 p-menubar 指令注册到您的组件。尝试将指令元数据添加到@Component。

@Component(
  selector: 'my-app',
  template: '<h1>My First Angular 2 App</h1><p-menubar [model]="items"></p-menubar>',
  directives: [PMenubar]
)

【讨论】:

不,没有错误,我无法添加指令:[PMenubar],他们说“找不到 PMenubar”,所以我尝试指令:[Menubar],但仍然无法正常工作......跨度> “PMenubar”不是primeng指令

以上是关于如何使 PrimeNG 菜单栏组件工作?的主要内容,如果未能解决你的问题,请参考以下文章

我应该怎么做才能使这个菜单栏在 Internet Explorer 7 及更高版本中正常工作?

滚动时如何使菜单栏固定在顶部

如何使侧边栏菜单元素居中

如何使菜单栏项显示表格中有多少行?

使菜单栏更接近 Web

js怎么样使左边显示菜单右边显示内容左边显示菜单栏 右边显示内容 菜单栏要可以有子菜单