Importing custom module into root module not working - angularjs

I have my root module which looks like this:
import { NgModule } from '#angular/core';
import { BrowserModule } from '#angular/platform-browser';
import { routing, appRoutingProviders } from './app.routing';
import { LoginModule } from './login/login.module';
import { UserModule } from './user/user.module';
import { NavbarModule } from './navbar/navbar.module';
import { AppComponent } from './app.component';
#NgModule({
imports: [ BrowserModule, routing, NavbarModule ],
declarations: [ AppComponent ],
providers: [ appRoutingProviders ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
I am writing a navbar with various components that handle various parts of the navbar (Im just trying to be really granular, sort of like spotify's approach).
So in the end I will have lots of components that all add up to once navbar, so that felt like a pretty natural use of a module? So I created a navbar module:
import { NgModule } from '#angular/core';
import { BrowserModule } from '#angular/platform-browser';
import { NavbarComponent } from './navbar.component';
#NgModule({
imports: [ ],
declarations: [ NavbarComponent ],
providers: [ ],
bootstrap: [ NavbarComponent ]
})
export class NavbarModule { }
for the sake of the example ill stick to one navbar component which looks like this
import { Component } from '#angular/core';
#Component({
selector: 'navbar',
templateUrl: './navbar.template.html'
})
export class NavbarComponent { }
the html template just contains standard bootstrap navbar code...
So as you can see I have imported the NavbarModule into the AppModule, which from my understanding of how modules work, should make the NavbarComponent available to all the components I define in the AppModule?
So when I use
in my html template for AppComponent it should render out the NavbarComponent stuff? Instead it just keeps an empty navbar tag?
Any ideas? Also if my understanding of how modules and their imports works is totally off, please could you link some material that could clarify this for me? I have read the angular docs and this is where I got my current understanding from.
Thanks

I found my problem. In the metadata of my navbar module, I was not exporting the navbar component, therefore it was not available to modules that imported it! Solution below
navbar.module
import { NgModule } from '#angular/core';
import { BrowserModule } from '#angular/platform-browser';
import { NavbarComponent } from './navbar.component';
#NgModule({
imports: [ ],
declarations: [ NavbarComponent ],
providers: [ ],
exports: [ NavbarComponent ],
bootstrap: [ NavbarComponent ]
})
export class NavbarModule { }

Related

How to add materialize to angular 2 project?

I am moving from angular 1.5 to angular 2 for this project while setting up new app i came to this issue so i am adding this library to app.
https://www.npmjs.com/package/angular2-materialize but this one throws error this library is not compatible. I want to use angular materialize that supports angular 2. Any better source or how to implement using above library.
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 { RouterModule } from '#angular/router';
import { AppComponent } from './app.component';
import { StreamComponent } from './stream/stream.component';
import { StreamService } from './stream.service';
import { routing } from './app.routes';
import { MaterializeModule } from "angular2-materialize";
const ROUTES = [
{
path: '',
redirectTo: 'app',
pathMatch: 'full'
},
{
path: 'stream',
component: StreamComponent
}
];
#NgModule({
declarations: [
AppComponent,
StreamComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
routing,
MaterializeModule
],
providers: [StreamService],
bootstrap: [AppComponent]
})
export class AppModule { }
ERROR
angular-material.js:13 Uncaught TypeError: Cannot read property 'module' of undefined
at angular-material.js:13
at angular-material.js:14
at angular-material.js:36390
(anonymous) # angular-material.js:13
(anonymous) # angular-material.js:14
(anonymous) # angular-material.js:36390
index.js:4 Uncaught ZoneAwareError {__zone_symbol__error: Error: Couldn't find Materialize object on window. It is created by the materialize-css library. Ple…, …}
To import materialize you need to add import statement in your code
import { MaterializeModule } from "angular2-materialize";
and after declare it in imports
#NgModule({
imports: [
//...
MaterializeModule,
],
//...
})
I guess in your case problem with import, try to declare MaterializeModule before routing. If it does not help pls provide error message

Ionic Cordova - undefined cannot be used as an entry compo

I'm trying to run an ionic app and i'm getting the following:
EDIT: rm -rf Node_Modules got rid of the first error:
I have a home page, another page called flashing, and a texting page. Nothing looks "off" about this code to me.
My code for app.module.ts:
import { BrowserModule } from '#angular/platform-browser';
import { ErrorHandler, NgModule } from '#angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '#ionic-native/splash-screen';
import { StatusBar } from '#ionic-native/status-bar';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import {TextingPage} from '../pages/texting/texting';
import { SMS } from '#ionic-native/sms';
import { HttpModule } from '#angular/http';
import {FlashingPage} from '../pages/flashing/flashing';
#NgModule({
declarations: [
MyApp,
HomePage,
TextingPage,
FlashingPage
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp),
HttpModule,
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
HomePage,
TextingPage,
FlashingPage,
IonicModule.forRoot(MyApp)
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
]
})
export class AppModule {}

Angular2: Component declared in shared module not usable in App module

I have two shared modules Core and MasterData.
I am facing issue to use MasterData module's components in my applcation though i can use Core Module's Components. Following is my code.
Core Module (core.module.ts)
import { NgModule, ModuleWithProviders, ComponentFactoryResolver } from '#angular/core';
import { CommonModule } from '#angular/common';
import { RouterModule } from '#angular/router';
import { FormsModule } from '#angular/forms';
import { HttpModule } from '#angular/http';
import {
IgHierarchicalGridComponent,
IgPivotGridComponent,
IgGridComponent
} from 'igniteui-angular2';
import { CacheModule } from 'angular2-cache';
import { AUTH_PROVIDERS } from 'angular2-jwt';
import { CoreComponents, EntryCoreComponents } from './components';
import { CoreService } from './services';
import { ClientInfoServiceProvider } from './client-info';
import { AuthGuard } from './guards/auth.guard';
const IgniteuiComponents = [
IgHierarchicalGridComponent,
IgPivotGridComponent,
IgGridComponent
];
#NgModule({
declarations: [
...CoreComponents,
...IgniteuiComponents
],
providers: [
...CoreService,
AUTH_PROVIDERS,
AuthGuard,
ClientInfoServiceProvider
],
imports: [
CommonModule,
FormsModule,
RouterModule,
HttpModule,
CacheModule,
],
entryComponents: [
...EntryCoreComponents
],
exports: [
HttpModule,
CacheModule,
RouterModule,
FormsModule,
...CoreComponents,
...IgniteuiComponents
]
})
export class CoreModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: QmsCoreModule,
providers: [
...CoreService,
AUTH_PROVIDERS,
AuthGuard,
ClientInfoServiceProvider
]
};
}
}
Master Data Module (which is inheriting Core because I use infragistics library in core and masterdata components) (masterdata.module.ts)
import { NgModule, ModuleWithProviders, ComponentFactoryResolver } from '#angular/core';
import { CommonModule } from '#angular/common';
import { RouterModule } from '#angular/router';
import { FormsModule } from '#angular/forms';
import { HttpModule } from '#angular/http';
import { QmsCoreModule } from 'qms/core/qms-core.module';
import { MasterdataComponents } from './components';
import { MasterdataServices } from './services';
#NgModule({
imports: [
CommonModule,
FormsModule,
RouterModule,
HttpModule,
QmsCoreModule.forRoot()
],
declarations: [
...MasterdataComponents
],
providers: [
...MasterdataServices
],
exports: [
FormsModule,
RouterModule,
HttpModule,
QmsCoreModule,
...MasterdataComponents
]
})
export class QmsMasterdataModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: QmsMasterdataModule,
providers: [
...MasterdataServices
]
};
}
}
Master data Module has currently only one component name TeamGrid. (Component Selector is ‘team-grid’)
Main Application AppModule (app.module.ts)
import { BrowserModule } from '#angular/platform-browser';
import { NgModule, Provider } from '#angular/core';
import { QmsMasterdataModule } from 'qms/masterdata/qms-masterdata.module';
import { SwacProxyInterface } from 'qms/core/swac';
import { AppRoutingModule } from './app-routing.module';
import { HomeModule } from './home/home.module';
import { ProjectModule } from './project/project.module';
import { AppComponent } from './app.component';
import { SharedServices } from './shared/services';
export const AppModule = (proxyInterface: SwacProxyInterface, provider: Provider[]) => {
#NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
HomeModule,
ProjectModule,
QmsMasterdataModule.forRoot()
],
providers: [
SharedServices,
...provider
],
bootstrap: [AppComponent]
})
class AppModule {
}
return AppModule;
};
Error message is:
'team-grid' is not a known element:
1. If 'team-grid' is an Angular component, then verify that it is part of this module.
2. If 'team-grid' is a Web Component then add "CUSTOM_ELEMENTS_SCHEMA" to the '#NgModule.schemas' of this component to suppress this message.
("
[ERROR ->]<team-grid></team-grid>
Can someone help me to find the correct solution for this?
Above Implementation is correct but only mistake is that each modules (Home.module / Project.module) under App.module should also import masterdata.module or core.module as per required compoenents.
This might help you to find out root cause
shared.module.ts
import { NgModule } from '#angular/core';
import { FormsModule } from '#angular/forms';
import { ReactiveFormsModule } from '#angular/forms';
import { HttpModule } from '#angular/http';
import { QmsMasterdataModule } from 'qms/masterdata/qms-masterdata.module';
#NgModule({
declarations: [
],
imports: [
CoreModule,
QmsMasterdataModule
],
exports: [
CoreModule,
QmsMasterdataModule
]
})
export class SharedModule {
}
App Module
import {SharedModule} from './modules/shared/shared.module';
export const AppModule = (proxyInterface: SwacProxyInterface, provider: Provider[]) => {
#NgModule({
declarations: [
AppComponent
],
imports: [
SharedModule
],
providers: [
],
bootstrap: [AppComponent]
})
class AppModule {
}
return AppModule;
};

How to import files from 3rd party into Angular 2 Typescript project?

I have an Angular 2 project with components that we bring on build into another project written in angular 1. The problem is the files are like 3rd party, we don't want any one to commit them only use them. The files are enter the "target" folder, but in App.Module.ts I can't set import to that folder. Any idea how to do that correctly?
What I don't understnad is how we can use componenet that written somewhere else if we must declare it in 'app.module.ts' files in order to use it in the project.
import { NgModule } from '#angular/core';
import { BrowserModule } from '#angular/platform-browser';
import { UpgradeModule } from '#angular/upgrade/static';
import { FormsModule } from '#angular/forms';
import { HttpModule } from '#angular/http';
/* HelloWorldComponent is a 3th party, its files are inside target folder,
so how to import it? */
/* import { HelloWorldComponent } from './app/hello-world.component';*/
#NgModule({
declarations: [
HelloWorldComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
UpgradeModule
],
exports: [
HelloWorldComponent
],
entryComponents: [
HelloWorldComponent
],
bootstrap: []
})
export class AppModule {
ngDoBootstrap() {}
}
import { platformBrowserDynamic } from '#angular/platform-browser-dynamic';
platformBrowserDynamic().bootstrapModule(AppModule).then(platformRef => {
const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
upgrade.bootstrap(document.body, ['myApp']);
;})
import * as _angular_ from 'angular';
declare global {
const angular: typeof _angular_;
}
import { downgradeComponent } from '#angular/upgrade/static';
angular.module('myApp')
.directive(
'helloWorld',
downgradeComponent({component: HelloWorldComponent}) as angular.IDirectiveFactory
);

Angular2 - using 3rd parety module's component

I created a module which has a directive in it (ObDatePickerModule).
Also I created a project which has ObDatePickerModule in it's dependencies (under dependencies in package.json).
Next I am importing Module A in my project's module:
import {BrowserModule} from '#angular/platform-browser';
import {NgModule} from '#angular/core';
import {FormsModule} from '#angular/forms';
import {ObDatePickerModule} from 'ng2-date-picker';
import {AppComponent} from './app.component';
#NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
FormsModule,
ObDatePickerModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {
}
Here is the app.component of the project:
import {Component} from '#angular/core';
import {ObDayPickerComponent} from 'ng2-date-picker';
import * as moment from 'moment';
#Component({
selector: 'app-root',
template: '<ob-day-picker [(ngModel)]="date"></ob-day-picker>',
styleUrls: ['./app.component.css'],
entryComponents: [ObDayPickerComponent]
})
export class AppComponent {
date = moment();
}
Here is the error that I am getting:
main.bundle.js:66421 Unhandled Promise rejection: Template parse errors:
'ob-day-picker' is not a known element:
1. If 'ob-day-picker' is an Angular component, then verify that it is part of this module.
2. If 'ob-day-picker' is a Web Component then add "CUSTOM_ELEMENTS_SCHEMA" to the '#NgModule.schemas' of this component to suppress this message. ("[ERROR ->]<ob-day-picker [(ngModel)]="date"></ob-day-picker>
I checked that the component name is really ob-day-picker.
I have also consoled log both the module and the ObDayPickerComponent imports and it seems that the imports are correct.
What did I miss?
Checkout the module repo:
https://bitbucket.org/vlio20/ng2-date-picker
The project can be found here:
https://github.com/vlio20/3rd-ng2-module
If you want to use ObDayPickerComponent outside of ObDatePickerModule you have to export it like:
#NgModule({
declarations: [
AppComponent,
ObDayPickerComponent,
ObCalendarComponent
],
imports: [
BrowserModule,
FormsModule
],
exports: [ObDayPickerComponent], // this line
bootstrap: [AppComponent]
})
export class ObDatePickerModule {}

Resources