Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 余烬存储添加属性不正确_Javascript_Ember.js_Local Storage_Ember Cli - Fatal编程技术网

Javascript 余烬存储添加属性不正确

Javascript 余烬存储添加属性不正确,javascript,ember.js,local-storage,ember-cli,Javascript,Ember.js,Local Storage,Ember Cli,我使用的是最新版本的ember cli、ember data、ember localstorage adapter和ember 我有一个节点对象,它有父对象和子对象。因为我在使用同一类型的对象创建多个关系时遇到问题,所以我决定将parentID存储在字符串中,将childId存储在字符串数组中。但是,当我创建一个新节点并尝试将新节点添加到ID的父数组时,该ID最终会添加到正确的父节点,但也会添加到其他父节点 level 1 0 / \ level 2 1

我使用的是最新版本的ember cli、ember data、ember localstorage adapter和ember

我有一个
节点
对象,它有父对象和子对象。因为我在使用同一类型的对象创建多个关系时遇到问题,所以我决定将parentID存储在字符串中,将childId存储在字符串数组中。但是,当我创建一个新节点并尝试将新节点添加到ID的父数组时,该ID最终会添加到正确的父节点,但也会添加到其他父节点

level 1      0
            / \
level 2    1   2
           |   |
level 3    3   4
在这样的结构中,0、1和2都有正确的子ID和父ID。但是,在添加3和4之后,节点1和节点2的childId分别为[3,4],而不是[3]、[4]

数组属性:

var ArrayTransform = DS.Transform.extend({
  serialize: function(value) {
    if (!value) {
      return [];
    }
    return value;
  },
  deserialize: function(value) {
    if (!value) {
      return [];
    }
    return value;
  }
});
insertNode代码:

insert: function(elem) {
  var i,
      _store = elem.node.store,
      newNodeJSON = elem.node.serialize();

  newNodeJSON.childIds = [];
  newNodeJSON.level = getNextLevel();

  _store.filter('node', function(node) {
    return node.get('level') === newnodeJSON.level-1;
  }).then(function(prevLevelNodes) {

    // if no other nodes yet
    if (prevLevelNodes.toArray().length === 0) {
      makeNewNode(_store, newNodeJSON, elem.node);
    }

    // else, generates however many nodes that are in the previous level
    else {
      prevLevelNodes.toArray().forEach(function(node, idx) {
        newNodeJSON.parentId = node.get('id');
        makeNewNode(_store, newNodeJSON, elem.node);
      });
    }
  });
}

var makeNewNode = function(_store, newNodeJSON, node) {

  console.log(newNodeJSON.parentId); // returns correct value

  var newNode = _store.createRecord('node', newNodeJSON);
  newNode.save();

  var newNodeId = newNode.get('id');

  if (newNode.get('parentId')) {
    _store.find('node', newNode.get('parentId')).then(function(n) {
      var cids = n.get('childIds');
      console.log(newNodeId); // returns expected value
      console.log(cids); // **DOESN'T RETURN AN EMPTY ARRAY**: returns array with [3,4]
      cids.push(newNodeId);
      console.log(n.get('childIds')); // returns array with [3,4]
      n.save();
    });
  }

除此之外,此错误90%的时间都会发生,但10%的时间都会按预期执行。这似乎表明存在某种比赛条件,但我甚至不确定那会是什么情况。我觉得有些地方可能会引起问题:在创建新节点时,
ember-cli
编译,将整个
\u-store
传入,
ember-data
很奇怪,
ember-localstorage-adapter
很时髦。。。没有线索。

对于将来可能有这个问题的人来说:问题在于两件事

  • 在ArrayTransform中,我通常返回未经修改的值
  • 在我的
    insert
    代码中,我将在函数顶部定义的相同JSON传递给
    makeNewNode
此JSON包含对单个
childId
数组的引用;因此,创建的每个新节点都对其子ID使用相同的引用。虽然这不能完全解释为什么在执行
推送
之前
cids
数组不是空的(也许这是某种编译器的奇怪之处或控制台打印延迟),但它解释了为什么这两个级别3的子级都在两个级别2的父级
子级ID
数组中

tl;dr:通过值vs通过引用错误