I usually manage to find what I'm doing wrong just by looking at existing questions, but nothing helped here.
I am working with a simple Ng2 module that tries to display and update the contents of a NeDB repository.
Remember, I have no problems with the NeDB repository, I confirmed that it updates correctly and loads correctly, so the problems that I have are somewhere else.
I have the following problems:
"asynchronous channel is not working."
I have this module.
@NgModule({
imports: [CommonModule],
exports: [],
declarations: [WikiComponent],
providers: [WikiDbService],
})
export class WikiModule { }
I have this component.
@Component({
selector: 'wiki',
templateUrl: './wiki.component.html'
})
export class WikiComponent implements OnInit {
items: Observable<WikiItem[]>;
constructor(private _db : WikiDbService) { }
ngOnInit() {
this.items = this._db.items;
this.items.subscribe({
next: x => console.log("got value", x),
error: e => console.error("observable error", e),
complete: () => console.log("done")
});
}
}
I have this template.
<p>{{items | async | json}}</p>
<ul>
<li *ngFor="let item of (items | async)">{{item.name}}</li>
</ul>
<input #newName (keyup)="0">
<button (click)="_db.addByName(newName.value)">ADD</button>
And I have this service.
@Injectable()
export class WikiDbService {
private sub: BehaviorSubject<WikiItem[]> = new BehaviorSubject<WikiItem[]>([]);
private db: DataStore;
public items: Observable<WikiItem[]> = this.sub.asObservable();
constructor() {
console.log("BehaviorSubject", this.sub);
console.log("Observable", this.items);
this.db = new DataStore(
{
filename: path.join(app.getAppPath(),"wiki.db"),
autoload: true,
onload:
(err)=>{
if(!err) {
this.db.find<WikiItem>({},
(e,docs) => {
if(!e) {
this.sub.next(docs);
}
})
}
}
});
}
public add(v: WikiItem) {
this.db.insert(
v,
(e, nDoc) =>
{
if(!e) {
this.sub.next([...this.sub.getValue(),nDoc]);
}
}
)
}
public addByName(str:string) {
this.add({name: str, _id: undefined});
}
}
When routing to my component with non-empty persistent storage, I get the following console log (corresponding to registration in the component's OnInit method):
got value > [] (wiki.component.ts:20)
got value > [Object, Object, Object, Object] (wiki.component.ts:20)
DOM :
<wiki>
<p>[]</p>
<ul>
</ul>
<input>
<button>ADD</button>
</wiki>
, . .
- , ?
12/19/16 3:45 pm
ngFor " | " , , , , , , , . .
12/20/16 3.06pm
@olsn, items , , Observable.
. , . .
:
( )
@Component({
selector: 'wiki',
templateUrl: './wiki.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class WikiComponent implements OnInit {
items: Observable<WikiItem[]> = this._db.items
.do(x => console.log("got value", x))
.publishReplay().refCount();
constructor(private _db : WikiDbService, private _cd: ChangeDetectorRef) { }
ngOnInit() {
}
reload() : void {
this._cd.markForCheck();
}
}
:
<button (click)="reload()">REFRESH</button>
@osln .
, sub.next , , , Angular.
Angular NgZone .
@osln.