Angular connector for spawn-x (AoT supports).
With npm:
npm install angular-spawn-x --save
With yarn:
yarn add angular-spawn-x
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>App</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<app-root>Loading...</app-root>
</body>
</html>
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule);
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { NgSpawnModule } from 'angular-spawn-x';
import { configureStore } from './store';
import { AppComponent } from './app.component';
import { PresenterComponent } from './components/presenter.component';
import { UserActions } from './actions/user';
@NgModule({
declarations: [
AppComponent,
PresenterComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
NgSpawnModule.forRoot(configureStore)
],
providers: [UserActions],
bootstrap: [AppComponent]
})
export class AppModule { }
import { createStore, addInterceptor } from 'angular-spawn-x';
const initialState = {
users: [],
some: {
text: 'Hello World'
},
parent: {
child: 'I am child'
}
};
function logger(store) {
return next => action => {
next(action);
console.log('action: ', action.type + ' -> ', action.data);
}
}
export function configureStore() {
return createStore(initialState, addInterceptor(logger));
}
import { Injectable } from '@angular/core';
import { NgSpawn } from 'angular-spawn-x';
@Injectable()
export class UserActions {
constructor(private ngSpawn: NgSpawn) {}
addUser = user => {
this.ngSpawn.update('users', {
data: this.ngSpawn.select('users').concat(user),
type: 'ADD_NEW_USER'
});
}
}
import {
Component,
OnInit,
OnDestroy,
ChangeDetectionStrategy
} from '@angular/core';
import { NgSpawn } from 'angular-spawn-x';
import { UserActions } from '../actions/user';
@Component({
selector: 'app-root',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<app-presenter
[users]="users"
[text]="text"
[data]="data"
(addUser)="addUserHandler($event)">
</app-presenter>
`
})
export class AppComponent implements OnInit, OnDestroy {
constructor(
private ngSpawn: NgSpawn,
private userActions: UserActions
){}
ngOnInit() {
//selection from store
const selection = {
users: 'users',
text: 'some.text',
data: ['parent.child', state => state.parent.child]
};
//connect to store
this.ngSpawn.connect(selection)(this);
}
ngOnDestroy() {
//disconnect from store
this.ngSpawn.disconnect(this);
}
addUserHandler(user) {
this.userActions.addUser(user);
}
}
import {
Component,
OnInit,
Input,
Output,
EventEmitter,
ChangeDetectionStrategy
} from '@angular/core';
@Component({
selector: 'app-presenter',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<div>
<h1>User List</h1>
<ul>
<li *ngFor="let user of users">{{ user.name }} | {{ user.age }}</li>
</ul>
<form (submit)=handleSubmit($event)>
<input type="text" name="name"/>
<input type="number" name="age"/>
<button type="submit">Add New User</button>
</form>
</div>
`
})
export class PresenterComponent implements OnInit {
@Input() users: any;
@Input() text: string;
@Input() data: string;
@Output() addUser = new EventEmitter<any>();
constructor() {}
ngOnInit() {}
handleSubmit = ev => {
console.log('some text from state: ', this.text);
console.log('some data from state: ', this.data);
this.addUser.emit({
name: ev.target.name.value,
age: ev.target.age.value
})
ev.target.name.value = '';
ev.target.age.value = '';
}
}
MIT © Alex Plex