Robert Petz
Robert Petz

Reputation: 2764

Ember Data model find by query deferred?

If I have a query that defines the model for my route:

App.MyRoute = Ember.Route.extend({
    model: function (params) {
        return this.store.find('MyModel', {myProperty: myValue}).then(function(results) {  
            return results.get('firstObject'); 
        });
    }
});

How do I handle the case where the store has not yet been populated with the results of the above query?

I want the query to update the model with the results of the above query whenever a value is inserted into the store that satisfies the query.

Is this possible?

NOTE: I'm using the FixtureAdapter as I'm not using a REST back end and I don't need the persistence layer. As such, I have implemented the findQuery method myself as follows:

App.ApplicationAdapter = DS.FixtureAdapter.extend({
    queryFixtures: function(records, query, type) {
        return records.filter(function(record) {
            for(var key in query) {
                if (!query.hasOwnProperty(key)) { continue; }
                var value = query[key];
                if (record[key] != value) { return false; }
            }
            return true;
        });
    }
});

I am absolutely open to changing this up if it will help me reach this end.

Upvotes: 1

Views: 907

Answers (1)

Kingpin2k
Kingpin2k

Reputation: 47367

Use a filter, it is a live record array that updates as new records are injected into the store. As a side note, filter doesn't make a call to the server for records, so if you still want that to happen you'll want to still make the find call, and then just return the filter.

App.MyRoute = Ember.Route.extend({
    model: function (params) {
        // trigger a find
        this.store.find('MyModel', {myProperty: myValue});
        // return a live filter (updates when the store updates)
        return this.store.filter('MyModel', function(record){
          return record.get('myProperty') == myValue;
        });
    }
});

Upvotes: 1

Related Questions