2013-10-26 9 views
62

Sto utilizzando Ember.js con l'adattatore di archiviazione locale. Ho un problema strano durante l'aggiornamento dei record.Ember js - Interruzioni di relazioni di Hasmany dopo l'aggiornamento di altre tabelle

Ho un modello postale e commenti con i rapporti hasMany:

App.Post = DS.Model.extend({ 
    title: DS.attr('string'), 
    comments: DS.hasMany('comment', { 
     async: true 
    }) 
}); 
App.Comment = DS.Model.extend({ 
    message: DS.attr('string') 
}); 

Questi sono i miei post ei commenti controllori:

App.PostsController = Ember.ArrayController.extend({ 
    newTitle: '', 
    actions: { 
     create: function() { 
      var title = this.get('newTitle'); 
      var post = this.store.createRecord('post', { 
       title: title 
      }); 
      this.set('newTitle', ''); 
      post.save(); 
     } 
    } 
}); 
App.CommentsController = Ember.ArrayController.extend({ 
    needs: "post", 
    post: Ember.computed.alias("controllers.post.model"), 
    newMessage: '', 
    actions: { 
     create: function() { 
      var message = this.get('newMessage'); 
      var comment = this.store.createRecord('comment', { 
       message: message 
      }); 
      var post = this.get('post'); 
      var comments = post.get('comments'); 
      if (comments.get('content') == null) comments.set('content', []); 
      comments.pushObject(comment); 
      comment.save(); 
      post.save(); 
     } 
    } 
}); 

Mentre la creazione di record relazioni hasMany aggiornati correttamente.

{ 
    "App.Post": { 
     "records": { 
      "0v66j": { 
       "id": "0v66j", 
       "title": "post1", 
       "comments": ["p31al", "tgjtj"] 
      } 
     } 
    }, 
    "App.Comment": { 
     "records": { 
      "p31al": { 
       "id": "p31al", 
       "message": "comment 1" 
      }, 
      "tgjtj": { 
       "id": "tgjtj", 
       "message": "comment 2" 
      } 
     } 
    } 
} 

Il problema si verificava durante la modifica del post. I rapporti sono andati dopo la modifica del record di posta. Ho fatto qualche ricerca e ho trovato questo codice:

DS.JSONSerializer.reopen({ 
    serializeHasMany: function(record, json, relationship) { 
     var key = relationship.key; 
     var relationshipType = DS.RelationshipChange.determineRelationshipType(record.constructor, relationship); 
     // alert(relationshipType); 
     if (relationshipType === 'manyToNone' || relationshipType === 'manyToMany' || relationshipType === 'manyToOne') { 
      json[key] = Ember.get(record, key).mapBy('id'); 
      // TODO support for polymorphic manyToNone and manyToMany 
      // relationships 
     } 
    } 
}); 

Questo ha fatto il trucco e ha funzionato bene. Ma ora ho un altro problema. Se modifico qualsiasi altro disco, tutti i riferimenti id sono sostituiti da tutto l'oggetto in questo modo:

{"App.Post":{"records":{"0v66j":{"id":"0v66j","title":"post2","comments":[**{"message":"comment 1"}, 
{"message":"comment 2"}**]},"8nihs":{"id":"8nihs","title":"post3","comments":["b4v2b","dbki4"]}}}, 
"App.Comment":{"records":{"p31al":{"id":"p31al","message":"comment 1"},"tgjtj":{"id":"tgjtj","message":"comment 2"}, 
"b4v2b":{"id":"b4v2b","message":"comments3"},"dbki4":{"id":"dbki4", 
"message":"comments4"}}}} 

commento refrences dovrebbero essere commenti "[" p31al", 'tgjtj'] come questo, ma gli ID sono sostituite da "commenti": [: { "message": "commento 2"}, {"commento 1" "messaggio"}]

+0

Non riesci a aggiornare solo in modo dinamico il commento? Invece di restituire l'intero oggetto JSON? – yardpenalty

risposta

-1

ho notato alcune cose nel mio percorso con Ember .. e soprattutto Ember-Data.

Uno di questi è quando si tratta di associazioni che ho dovuto riaggiungere manualmente nelle associazioni salvando un dovendo ri-salvare, e usare addObject per le associazioni in memoria mentre stai usando un po 'qui. :)

Si noti che questo di solito accade solo quando aggiorno più di un nuovo oggetto in una volta. Ad esempio, se il tuo post è nuovo e anche il tuo commento è nuovo.

Sono un po 'preoccupato di vedere il codice seguente nella base di codice, perché non dovrebbe essere necessario. Non dovresti mai avere oggetti null o non-array nelle tue associazioni. Io non sono sicuro di quello che hai fatto aggiustamenti con l'adattatore e perché era necessario, ma spero che non era il motivo:

if(comments.get('content') == null) 
    comments.set('content', []); 

In ogni caso, il seguente codice è come avrei probabilmente scrivere la vostra azione creare. Potrebbe aiutare. Spero lo faccia.

create: function() { 
    // get the post for association on the new comment 
    var post = this.get('post'); 

    // get the message to store on the new comment 
    var message = this.get('newMessage'); 

    var comment = this.store.createRecord('comment', { 
    message : message, 
    post : post 
    }); 

    comment.save().then(function(savedComment) { 
    post.get('comments').addObject(savedComment); 
    }); 
} 

Si noti che è molto più semplice. Generalmente, se stai facendo cose complicate e complicate, qualcosa non funziona ed è ora di tornare alle origini e aggiungere una cosa alla volta, testando accuratamente tra le aggiunte. :)

Buona fortuna!

+2

Questo ha aiutato il tuo problema? Come va? –

1

Quando si utilizza ApplicationSerializer che estende LSSerializer, sembra funzionare.

Forse è stato risolto dal momento della richiesta?

Problemi correlati