处理aurelia中的集合更新

时间:2015-10-16 19:51:57

标签: javascript aurelia

我正在努力处理Aurelia中的收藏更新。想象一下,我有一个视图(带有注释的新闻列表),它是使用以下模型中的一组repeat.fors构建的:

var news = [
    {
        id: 1,
        title: 'Some title',
        comments : ['comment1']
    },
    {
        id: 2,
        title: 'Some title',
        comments : ['comment1']
    },
    {
        id: 3,
        title: 'Some title',
        comments : ['comment1']
    }    
];

我还使用setInterval()创建了计时器,它每秒都会获取新闻列表。现在想象下面的新闻列表会回来:

var freshNews = [
    {
        id: 1,
        title: 'Some title',
        comments : ['comment1', 'comment2']
    },
    {
        id: 2,
        title: 'Some title',
        comments : ['comment1']
    }
];

如果我在我的重复中使用这个freshNews列表,它将重建整个DOM,显示导致闪烁的消息和用户输入的数据丢失(想象每条新闻下面都有textarea用于输入评论)。

我如何处理这种情况?这在Angular中运行得非常好,这要归功于它的脏检查和ngRepeat工作方式(angular不会破坏对应于未更改的对象的DOM),在React中,由于shadow DOM,它也会很好用。

如何在Aurelia处理这种情况?

1 个答案:

答案 0 :(得分:6)

问题实际上并不是关于收藏品。这是一个普遍的JS问题。 How to duplicate object properties in another object?

所以你可以很好地处理它。

你可以:

iterate over your updates {
   find a relevant object in news
   if there is none { 
      just push the new one to collection
   }
   otherwise {
      apply new values to the old one
   }
}

即使您将编辑器绑定到同一个对象 - 它也不会破坏用户评论。

freshNews.forEach(n=>{

    let update = news.find(o=>o.id==n.id)
    if (!update) {
        news.push(n)
    }
    else {
        Object.assign(update,n)
    }
})