Skip to content

Commit

Permalink
Merge pull request #2361 from H1D/filteredArrayDestroy
Browse files Browse the repository at this point in the history
Proper filteredRecordArray destroy
  • Loading branch information
fivetanley committed Nov 20, 2014
2 parents adafaba + f509c9b commit 894457a
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 1 deletion.
14 changes: 14 additions & 0 deletions packages/ember-data/lib/system/record_array_manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
} from "ember-data/system/map";
var get = Ember.get;
var forEach = Ember.EnumerableUtils.forEach;
var indexOf = Ember.EnumerableUtils.indexOf;

/**
@class RecordArrayManager
Expand Down Expand Up @@ -266,6 +267,19 @@ export default Ember.Object.extend({
this.updateFilter(array, type, filter);
},

/**
Unregister a FilteredRecordArray.
So manager will not update this array.
@method unregisterFilteredRecordArray
@param {DS.RecordArray} array
*/
unregisterFilteredRecordArray: function(array) {
var recordArrays = this.filteredRecordArrays.get(array.type);
var index = indexOf(recordArrays, array);
recordArrays.splice(index, 1);
},

// Internally, we maintain a map of all unloaded IDs requested by
// a ManyArray. As the adapter loads data into the store, the
// store notifies any interested ManyArrays. When the ManyArray's
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,5 +62,18 @@ export default RecordArray.extend({

updateFilter: Ember.observer(function() {
Ember.run.once(this, this._updateFilter);
}, 'filterFunction')
}, 'filterFunction'),

/**
@method _unregisterFromManager
@private
*/
_unregisterFromManager: function(){
this.manager.unregisterFilteredRecordArray(this);
},

willDestroy: function(){
this._unregisterFromManager();
this._super();
}
});
58 changes: 58 additions & 0 deletions packages/ember-data/tests/integration/filter_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,23 @@ module("integration/filter - DS.Model updating", {
}
});

function tapFn(fn, callback) {
var old_fn = fn;

var new_fn = function() {
var result = old_fn.apply(this, arguments);
if (callback) {
callback.apply(obj, arguments);
}
new_fn.summary.called.push(arguments);
return result;
};
new_fn.summary = { called: [] };

return new_fn;
}


test("when a DS.Model updates its attributes, its changes affect its filtered Array membership", function() {
store.pushMany('person', array);

Expand Down Expand Up @@ -515,3 +532,44 @@ test("a Record Array can update its filter after server-side creates multiple re
serverResponds();
equal(get(recordArray, 'length'), 5, "The record array updates when the server creates multiple records");
});

test("a Record Array can update its filter after server-side creates multiple records", function() {
setup({
createRecord: function(store, type, record) {
switch (record.get('name')) {
case "Client-side Mike":
return Ember.RSVP.resolve({id: 4, name: "Scumbag Server-side Mike"});
case "Client-side David":
return Ember.RSVP.resolve({id: 5, name: "Scumbag Server-side David"});
}
}
});

clientCreates(["Mike", "David"]);
equal(get(recordArray, 'length'), 3, "The record array does not include non-matching records");

serverResponds();
equal(get(recordArray, 'length'), 5, "The record array updates when the server creates multiple records");
});

test("destroying filteredRecordArray unregisters models from being filtered", function() {
var filterFn = tapFn( function(){ return true; } );

var person = store.push('person', {
id: 1,
name: 'Tom Dale'
});

var recordArray = store.filter('person', filterFn);

equal(filterFn.summary.called.length, 1);

Ember.run(function(){
recordArray.then(function(array){
array.destroy()
});
});
clientEdits([1]);

equal(filterFn.summary.called.length, 1, 'expected the filter function not being called anymore');
});

0 comments on commit 894457a

Please sign in to comment.