【问题标题】:Angular/Ionic RXJS update Observable array rather than appendingAngular/Ionic RXJS 更新 Observable 数组而不是追加
【发布时间】:2017-10-27 21:35:36
【问题描述】:

这是一个离子应用程序的功能,它显示您附近的所有用户。问题是,如果用户更改他们的姓名或位置,它将作为新项目添加到数组中,而不是更新现有项目。 . 我怎么可能将更新提供给 ionic2 ngFor 循环?

public outputUsersCloseToMe() : Observable<Array<displayAllUsers>> {

    let availableUsers = <Array<displayAllUsers>>[];

        this.firebaseInit().database().ref('users').child(key).child('profile').on('value', (userprofile) => {  
            if( userprofile.val() ) {
                availableUsers.push({ 
                    id: userprofile.val().id,                        
                    gender: userprofile.val().gender,
                    distance: distance.toFixed(2),
                    location: location,
                    firstName: userprofile.val().firstName,                        
                });        
            }
        }); 

    return Observable.from([availableUsers]).map(val => val); 
}

【问题讨论】:

  • 好吧,您正在将一个新项目推送到数组中,所以这是预期的行为。简单的解决方案:在将新项目推入之前清除数组...
  • 是的,这就是后备计划,但 RXJS 确实提供了一些更优雅的东西

标签: javascript angular ionic-framework ionic2 rxjs


【解决方案1】:

您可以使用地图而不是数组。

let availableUsers = <Map<String,displayAllUsers>> new Map;

你通过 id 更新它

availableUsers.set(id, { 
  id: userprofile.val().id,                        
  gender: userprofile.val().gender,
  distance: distance.toFixed(2),
  location: location,
  firstName: userprofile.val().firstName,                        
});

您只使用存储在地图中的values 创建一个可观察对象

return Observable.from([availableUsers.values()]); 

【讨论】:

  • 谢谢,我试过了,它给了我错误.set is not a function
  • 您需要使用new Map 而不是{}。代码更新
  • 仍然不走运找不到“字符串”类型的不同支持对象“空”。 NgFor 只支持绑定到 Arrays 等 Iterables。
  • 看起来 Angular 无法处理可观察的迭代器,它需要可观察的可迭代对象(或数组)。相反,map 的 values 返回一个迭代器。试试return Observable.from([[...availableUsers.values()]]);
  • 其实Observable.of([...availableUsers.values()]);也一样,更好看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多