2017-03-06 155 views
1

好的可以有人请请帮我在这里我觉得我要疯了!绑定到可观察阵列

我有问题得到一个列表来更新angular2它似乎从四处张望我应该使用Observables某种?

所有听起来不错,但我有很多问题实施他们。

我需要关于如何使用可观察数组并在angular2中绑定它的帮助,以及使用可观察数组有什么好处?

比如我有一个模型的评论列表

this.comments = new Array<IComment>; 
    this.observableComments = Observable.from(this.comments); 
    // Note what is really odd with the above is typescript thinks 
    // the above is Observable<IComment> ??? not Observable<IComment[]> 
    // but when i debug it is ObservableArray with array property - ?? 

我有我的模板下面的div

<div *ngFor="let comment of comments | async | reverseOrder let i = index" >

好到目前为止好,但有似乎没有能力推或onNext我的可观察?!??!

我有一个叫做addComment的函数。我想要做的就是为我的observable数组添加一个值,以便更新我的UI。我没有使用任何数据服务在这里..

addComment(comment: IComment) { 
    this.comments.push(comment); 
    this.observableComments.onNext(this.comments); 
    // The above does not work 
    // neither onNext - next - push is a function on my observable array?? 
} 

我已经做了很多的搜索,并有使用的Rx对象和behaviourSubjects,但不知道如何绑定到这些在我的UI的例子的建议。我得到这些是流,但我不明白这将如何工作与我的管道和再次订购没有这样的例子

如果我直接绑定到我的数组Angular2不检测推的变化,因为它是相同的参考。

其他建议一直没有使用observables,只是做array.concat来创建一个新的数组和一个新的参考。这对我来说似乎很难!

ObservableArrays对我来说似乎毫无意义我没有得到什么?他们当然似乎没有观察数组​​,允许我设置一个新的数组值或给我任何能力推入数组。

+0

请问您的组件有onPush变化检测? Observable不能像onNext那样发出事件。您应该使用Subject或BehaviorSubject。有了Observable,你可以尝试调用'this.observableComments = Observable.from(this.comments);'在再次添加 – yurzui

+0

之后,不使用onPush,我可以通过订阅一个事件并使用changedDetectorRef并通过改变数组的参考。但我不想了解observable和使用它们的优点 –

+0

以下是在服务中使用BehaviorSubject的示例https://github.com/jhades/angular2-rxjs-observable-data-services/blob/master/src/state /TodoStore.ts – yurzui

回答

2

你可以试试这个方法:

private comments: IComment[]; 
private observableComments: BehaviorSubject<IComment[]>; 

constructor() { 
    this.comments = new Array<IComment>; 
    this.observableComments = <BehaviorSubject<IComment[]>>new BehaviorSubject([]); 
} 

get comments() { 
    return this.observableComments.asObservable(); 
} 

addComment(comment: IComment) { 
    this.comments.push(comment); 
    this.observableComments.next(Object.assign({}, this.comments)); 
} 
+0

@Annan A.谢谢 - 这看起来更接近我想要的。 Object.assign的好处与仅传递this.comments有什么区别? –

+1

这是更多功能方法的一部分,试图使状态保持不变 - 传递一个副本而不是引用。 –

+0

@Annan A.谢谢 - 是的,我明白.. –