2014-07-11 151 views
0

我正在使用最新版本的ember-cli,ember-data,ember-localstorage-adapter和ember。Ember store不正確地添加屬性

我有一個Node有一個父母和子女的對象。由於我用相同類型的對象創建多個關係時遇到了問題,因此我決定將parentID存儲在一個字符串中,並將childID存儲在一個字符串數組中。但是,當我創建一個新節點並嘗試將新節點添加到父節點ID數組中時,ID最終會添加到正確的父節點,但也會添加到其他父節點。

level 1  0 
      /\ 
level 2 1 2 
      | | 
level 3 3 4 

在這樣的結構中,0,1和2都有正確的子和父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編譯,在創建新節點時傳遞整個_storeember-data很奇怪,ember-localstorage-adapter很怪異...沒有線索。

回答

0

對於將來可能有這個問題的人:問題在於兩件事。

  • 在ArrayTransform中,通常我會返回值sans修改。
  • 在我的insert代碼中,我將相同的JSON傳遞給我在函數頂部定義的makeNewNode

此JSON包含對單個childIds數組的引用;因此,創建的每個新節點都將相同的參考用於其子標識。儘管這並不能解釋爲什麼在執行push之前cids數組並不是空的(也許這是某種編譯器奇怪或控制檯打印滯後),但這解釋了爲什麼這兩個三級孩子都在第2級父母的childIds陣列。

tl; dr:按值傳遞vs通過參考誤差