在ngOnInit()
我有“返回x”,我想将其放入Observable
,然后执行转换并以相同的格式再次返回。
以下是工作人员:http://plnkr.co/edit/z26799bSy17mAL4P5MiD?p=preview
import {Component} from '@angular/core'
import { Observable } from 'rxjs'
import * as Rx from 'rxjs/Rx'
@Component({
selector: 'my-app',
providers: [],
template: `
<div>
<h2>{{name}}</h2>
<button (click)="addToArray()">Add</button>
<ul>
<li *ngFor="let item of data$ | async">{{ item }}</li>
</ul>
</div>
`,
directives: []
})
export class App {
data = ["one","two","three"]
data$: Observable<Array<string>>;
constructor() {
this.name = 'Angular2 array to observable example'
}
ngOnInit() {
this.data$ = Rx.Observable.of(this.data)
.map(data => {
let x = data
x.push("4")
///
/// TRANSFORM X IN THIS SECTION OF THE CODE
/// HERE BY PUTTING IT INTO OBSERVABLE
/// PERFORMING TRANSFORMATIONS AND
/// RETURNING THE DATA TO BE RENDERED IN TEMPLATE
///
return x
})
}
addToArray() {
this.data.push('more numbers')
}
}
答案 0 :(得分:1)
有an adjusted and wirking plunker
我会用EventEmitter
和少数运营商实现这一点,主要是
调整后的代码
data = ["one","two","three"]
data$: Observable<string[]>;
protected emitter = new EventEmitter<string[]>();
constructor() {
this.name = 'Angular2 array to observable example'
this.data$ = this.emitter
.startWith(this.data)
.scan((orig, item) => orig.concat(item))
}
ngOnInit() {
// this.data$ = Rx.Observable.of(this.data)
// .map(data => {
// let x = data
// x.push("4")
// return x
// })
}
addToArray() {
//this.data.push('more numbers')
this.emitter.emit("forth")
}
检查here
还有更复杂的解决方案..只需从Observable及其中获利 运营商。它已准备好添加和删除项目:
data = ["one","two","three"]
data$: Observable<string[]>;
protected emitter = new EventEmitter<string[]>();
protected toDelete = new Rx.BehaviorSubject<string[]>([])
.scan((orig, item) => orig.concat(item));
constructor() {
this.name = 'Angular2 array to observable example'
this.data$ = this.emitter
// start
.startWith(this.data)
// return array
.scan((orig, item) => orig.concat(item))
// adjust each source string with a prefix
.map((coll: string[]) => {
let adjusted: string[] = []
coll.forEach(item => {
adjusted.push("x" + item)
})
return adjusted;
})
// now consume also array of items to be deleted
.combineLatest(this.toDelete)
// just those which were not delted
.map(([all, toDelete]:[string[], string[]]) =>{
let result = all.filter( function( el ) {
return toDelete.indexOf( el ) < 0;
});
return result;
})
}
counter: int = 0;
addToArray() {
this.emitter.emit(`other${++this.counter}`)
}
deleteFromArray(removeString) {
this.toDelete.next(removeString)
}
中查看
有一个final plunker with lot of data: string\[\]
array handling
我们现在甚至可以跟踪更改并让它们调整原始数据数组,甚至使用RESET函数,从新的开始。这是经过调整的代码:
data = ["one","two","three"]
data$: Observable<string[]>;
protected emitter: EventEmitter<string[]>;
protected toDelete: Rx.BehaviorSubject<string[]>;
constructor() {
this.initEmitters();
this.data$ = this.createObservable(this.data);
}
initEmitters() {
this.emitter = new EventEmitter<string[]>();
this.toDelete = new Rx.BehaviorSubject<string[]>([])
.scan((orig, item) => orig.concat(item));
}
createObservable(initData)
{
let observable = this.emitter
// start
.startWith(initData)
// return array
.scan((orig, item) => orig.concat(item))
// adjust each source string with a prefix
.map((coll: string[]) => {
let adjusted: string[] = []
coll.forEach(item => {
adjusted.push("x" + item)
})
return adjusted;
})
// now consume also array of items to be deleted
.combineLatest(this.toDelete)
// just those which were not delted
.map(([all, toDelete]:[string[], string[]]) =>{
let result = all.filter( function( el ) {
return toDelete.indexOf( el ) < 0;
});
return result;
})
observable
.subscribe((currentData) => {
this.data.length = 0;
[].push.apply(this.data, currentData)
});
return observable;
}
counter: int = 0;
addToArray() {
this.emitter.emit(`other${++this.counter}`)
}
deleteFromArray(removeString) {
this.toDelete.next(removeString)
}
resetArray() {
this.initEmitters();
this.data$ = this.createObservable(['ten','eleven'])
}