Advertisement
Guest User

Untitled

a guest
May 31st, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 KB | None | 0 0
  1. define(function(require) {
  2. 'use strict';
  3. var Ember = require('ember');
  4.  
  5. return Ember.Mixin.create({
  6. /**
  7. * Cache all relationship IDs each time the model is loaded or updated.
  8. * This data is required to determine if any relationships contain new
  9. * records (or omit old records) since the last server synchronization
  10. * (see this mixin's `areRelationshipsDirty` and `rollbackRelationships`
  11. * methods).
  12. */
  13. _handleSync: function() {
  14. var members = {};
  15.  
  16. this.eachRelationship(function(name) {
  17. members[name] = this.get('data.' + name).mapBy('id');
  18. }, this);
  19.  
  20. this.set('_cleanRelationshipMembers', members);
  21. }.on('didLoad', 'didUpdate'),
  22.  
  23. /**
  24. * Determine if any of the model's relationships have changed members since
  25. * the last synchronization with the server.
  26. *
  27. * @return {Boolean}
  28. */
  29. areRelationshipsDirty: function() {
  30. var previous = this.get('_cleanRelationshipMembers');
  31.  
  32. if (!previous) {
  33. return false;
  34. }
  35.  
  36. return !Ember.keys(previous).every(function(name) {
  37. var currentIds = this.get('data.' + name).mapBy('id');
  38. var previousIds = previous[name];
  39.  
  40. if (currentIds.length !== previousIds.length) {
  41. return false;
  42. }
  43.  
  44. return previousIds.every(function(id) {
  45. return currentIds.indexOf(id) > -1;
  46. });
  47. }, this);
  48. },
  49.  
  50. /**
  51. * Revert any and all relationships to their last-known synchronized state.
  52. */
  53. rollbackRelationships: function() {
  54. var store = this.store;
  55. var cleanRelationshipMembers = this.get('_cleanRelationshipMembers');
  56.  
  57. /**
  58. * As a minor performance optimization, do not re-set any relationships
  59. * if none of them are dirty.
  60. */
  61. if (!this.areRelationshipsDirty()) {
  62. return;
  63. }
  64.  
  65. this.eachRelationship(function(name, descriptor) {
  66. var typeKey = descriptor.type.typeKey;
  67. var cleanMemberIds = cleanRelationshipMembers[name];
  68.  
  69. var cleanMembers = cleanMemberIds.map(function(id) {
  70. return store.getById(typeKey, id);
  71. });
  72.  
  73. this.set('data.' + name, cleanMembers);
  74. }, this);
  75. },
  76.  
  77. /**
  78. * Extend `Model#rollback` to provide ensure that the members of all
  79. * relationships are reverted
  80. */
  81. rollback: function() {
  82. this.rollbackRelationships();
  83.  
  84. this._super.apply(this, arguments);
  85. }
  86.  
  87. });
  88. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement