2013-10-07 71 views
1

是否可以在Ember數據中克隆(深層複製)記錄?我已經爲1.0beta之前的版本找到了答案,但是對於最新版本的Ember Data沒有任何答案。克隆記錄集 - 使用Ember數據金絲雀生成

這是我嘗試過什麼(幾乎沒有成功):

attributesOf: function(record) { 
    var attributes = record.get('constructor.attributes') 
     , newRecordAttributes = {} 

    attributes.forEach(function(attribute) { 
     newRecordAttributes[attribute] = record.get(attribute) 
    }) 

    return newRecordAttributes 
    } 

, cloneSnapshot: function(snapshot) { 
    var that = this 
     , regions = snapshot.get('regions') 
     , networks = snapshot.get('networks') 
     , terminals = snapshot.get('terminals') 
     , scenario = snapshot.get('scenario') 
     , newSnapshot = this.store.createRecord('snapshot', { 
         name: snapshot.get('name') 
         , timestamp: Date.now() 
         , autosave: false 
         , fresh: true 
         }) 
     , newRegions = regions.map(function(region) { 
         var newRegionObj = that.attributesOf(region) 
         newRegionObj.snapshot = newSnapshot 
         var test = that.store.createRecord('region', newRegionObj) 
         return test 
        }) 
     , newNetworks = networks.map(function(network) { 
         var newNetworkObj = that.attributesOf(network) 
         newNetworkObj.snapshot = newSnapshot 
         return that.store.createRecord('network', newNetworkObj) 
         }) 
     , newTerminals = terminals.map(function(terminal) { 
         var newTerminalObj = that.attributesOf(terminal) 
         newTerminalObj.snapshot = newSnapshot 
         newTerminalObj.location = newRegions.filterProperty('name', terminal.get('location.name'))[0] 
         newTerminalObj.network = newNetworks.filterProperty('name', terminal.get('network.name'))[0] 
         return that.store.createRecord('terminal', newTerminalObj) 
         }) 
    Ember.RSVP.all([newSnapshot, newRegions, newNetworks, newTerminals]).then(function(records) { 
     records[0].get('regions').pushObjects(newRegions) 
     records[0].get('networks').pushObjects(newNetworks) 
     records[0].get('terminals').pushObjects(newTerminals) 
    }) // doesn't work 
    // newSnapshot.set('regions', newRegions) // doesn't work 
    // newSnapshot.set('networks', newNetworks) // doesn't work 
    // newSnapshot.set('terminals', newTerminals) // doesn't work 
    // newSnapshot.get('regions').pushObjects(newRegions) // doesn't work 
    // newSnapshot.get('networks').pushObjects(newNetworks) // doesn't work 
    // newSnapshot.get('terminals').pushObjects(newTerminals) // doesn't work 
    return newSnapshot 
    } 

無論如何,我試試吧,newSnapshot.get('regions.length')最終被0。與networksterminals相同。

回答

0

Ember Data似乎沒有將DS.belongsTo關係傳播到DS.hasMany對應關係,所以我需要將新記錄推送到其相應的多關係中。我的一些關係定義爲{ async: true },這需要使用承諾回調來推送新記錄。沒有async定義的一個關係,即newTerminalObj.location.get('terminals'),要求記錄直接推送;使用承諾回調導致記錄從不被推送,因爲在沒有async定義時,關係缺少then方法。

attributesOf: function(record) { 
    var attributes = record.get('constructor.attributes') 
     , newRecordAttributes = {} 

    attributes.forEach(function(attribute) { 
     newRecordAttributes[attribute] = record.get(attribute) 
    }) 

    return newRecordAttributes 
    } 

, cloneSnapshot: function(snapshot) { 
    var that = this 
     , regions = snapshot.get('regions') 
     , networks = snapshot.get('networks') 
     , terminals = snapshot.get('terminals') 
     , scenario = snapshot.get('scenario') 
     , newSnapshot = this.store.createRecord('snapshot', { 
         name: snapshot.get('name') 
         , timestamp: Date.now() 
         , autosave: false 
         , fresh: true 
         }) 
     , newRegions = regions.then(function(array) { 
         return array.map(function(region) { 
         var newRegionObj = that.attributesOf(region) 
         newRegionObj.snapshot = newSnapshot 
         return that.store.createRecord('region', newRegionObj) 
         }) 
        }) 
     , newNetworks = networks.then(function(array) { 
         return array.map(function(network) { 
          var newNetworkObj = that.attributesOf(network) 
          newNetworkObj.snapshot = newSnapshot 
          return that.store.createRecord('network', newNetworkObj) 
         }) 
         }) 
     , newTerminals = Ember.RSVP.all([terminals, newRegions, newNetworks]).then(function(arrays) { 
         return arrays[0].map(function(terminal) { 
          var newTerminalObj = that.attributesOf(terminal) 
          newTerminalObj.snapshot = newSnapshot 
          newTerminalObj.location = arrays[1].filterProperty('name', terminal.get('location.name'))[0] 
          newTerminalObj.network = arrays[2].filterProperty('name', terminal.get('network.name'))[0] 
          var newTerminal = that.store.createRecord('terminal', newTerminalObj) 
          newTerminalObj.location.get('terminals').pushObject(newTerminal) 
          newTerminalObj.network.get('terminals').then(function(array) { 
          array.pushObject(newTerminal) 
          }) 
          return newTerminal 
         }) 
         }) 

    Ember.RSVP.all([newSnapshot.get('regions'), newRegions]).then(function(arrays) { 
     arrays[0].pushObjects(arrays[1]) 
    }) 
    Ember.RSVP.all([newSnapshot.get('networks'), newNetworks]).then(function(arrays) { 
     arrays[0].pushObjects(arrays[1]) 
    }) 
    Ember.RSVP.all([newSnapshot.get('terminals'), newTerminals]).then(function(arrays) { 
     arrays[0].pushObjects(arrays[1]) 
    }) 
    return newSnapshot 
    }