Mobx:Observable数组无法正确显示

时间:2016-03-10 23:26:25

标签: javascript arrays mobx

我试图了解如何在Mobx中使用observable数组。

我很难弄明白为什么:

if (!String.IsNullOrEmpty(rawxml) && rawxml.Contains("<rss"))//RSS Feeds
{
    //Create XML and remove unneeded xml nodes
    var xdoc = XDocument.Parse(rawxml);
    foreach (var item in xdoc.XPathSelectElements("//item/??some/xpath/here/to/get/unwanted/children"))
    {
        item.RemoveNodes();
        item.RemoveAll();
    }
        //Feed in the cleaned up xml into SyndicationFeed
        using (XmlReader r = xdoc.CreateReader())
        {
            SyndicationFeed rssfeed = SyndicationFeed.Load(r);
            //Do stuff
        }
    }
 }

写道:

let entities = observable([]);
entities[0] = "foo";
autorun(() =>{
  console.log(entities);
});

而不是经典数组?

2 个答案:

答案 0 :(得分:29)

弄清楚!

如文档中所述

  

请记住,Array.isArray(observable([]))将产生false,因此每当您需要将一个可观察数组传递给外部库时,最好先创建一个浅拷贝,然后再将其传递给其他使用array.slice()或array.peek(),库或内置函数(无论如何都是很好的做法)。所以Array.isArray(observable([])。slice())将产生true。

文档示例向我们展示了一个todos.filter()可能导致混淆,因为todos看起来像一个真正的JS数组。但事实并非如此。

因此,对于我的工作,我只需要console.log(entities.slice()),它将显示一个真正的JS数组。

答案 1 :(得分:0)

记录mobx的另一种方法是使用toJS方法

import { toJS } from 'mobx';

class Store {
  @observable
  fruits = ['Apple', 'Banana'];

  constructor() {
    console.log('this.views :', toJS(this.data));
  }
}

export default new Store();

希望获得帮助。 Source