【问题标题】:Ember-Data store.filter with async relationships具有异步关系的 Ember-Data store.filter
【发布时间】:2015-05-12 10:40:49
【问题描述】:

我正在开发一个调查应用程序,我们正在使用现有的 API。我们的模型如下所示:

App.User = DS.Model.extend({
  name: DS.attr('string'),
  participations: DS.hasMany('participation', {async: true})
});

App.Participation = DS.Model.extend({
  user: DS.belongsTo('user', {async: true}),
  survey: DS.belongsTo('survey', {async: true}),
  hasCompleted: DS.attr('boolean'),
  hasAccepted: DS.attr('boolean')
});

App.Survey = DS.Model.extend({
  participations: DS.hasMany('participation', {async: true}),
  title: DS.attr('string'),
  locked: DS.attr('boolean')
});

我想通过store.filter 从我的模型挂钩返回一个实时记录数组,但是这个过滤器需要处理当前用户的调查和异步参与者记录。如何在过滤器回调函数中处理异步关系解析?

  model: function() {
    return Ember.RSVP.hash({
      user: this.store.find('user', 1),
      surveys: this.store.filter('survey', {}, function(survey) {
        return !survey.get('locked'); //How do I get the participation record for the current user for the current poll so I can also filter out the completed true
      })
    });
  }

如果使用调查的实时记录数组不是处理这个问题的最佳方法,那是什么?

编辑: 我已经更新了尝试的方法:

App.SurveysRoute = Ember.Route.extend({
  model: function() {
    return Ember.RSVP.hash({
      user: this.store.find('user', 1),
      all: this.store.find('survey'),
      locked: this.store.filter('survey', function(survey) {
        return survey.get('locked');
      }),
      completed: this.store.filter('participation', {user: 1}, function(participation) {
        return participation.get('hasCompleted');
      }),
      outstanding: this.store.filter('participation', {user: 1}, function(participation) {
        return !participation.get('hasCompleted') && !participation.get('poll.locked');
      })
    });
  }
});
App.SurveysCompletedRoute = Ember.Route.extend({
  model: function() {
    return this.modelFor('surveys').completed.mapBy('survey');
  }
});

http://jsbin.com/vowuvo/3/edit?html,js,output

但是,在我的过滤器中使用异步属性 participation.get('poll.locked') 是否会造成潜在问题?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    我最初用 ES6 和 ember-cli 格式编写了我的回复,同时将 Ember 引用本地化...请原谅这是否有点基本,因为我将其恢复为 ES5 并使用了 Ember 的普遍理解的代码结构。

    试试这个:

    // beforeModel() and model() are skipped if coming from a collection
    // ie: from '/users' to '/users/1'
    // setting this up is purely for direct linking to this route's path.
    model: function(params) {
        return this.store.findRecord('user', params.id).then(function(user) {
            return user.get('participations');
        });
    },
    
    // only fired once! 
    // soon to be obsolete...
    setupController: function(controller, model) {
        controller.set('model', model);
    
        var store  = this.store,
            userId, availSurveys, completed, outstanding;
    
        store  = this.store;
        userId = model.get('id');
    
        // this is a promise!
        // also, these filters can be applied elsewhere that Store is available!
        availSurveys = store.filter(
            // modelName to be filtered.
                        'surveys',
            // this part is the query - sent as a request to server, not used as a filter 
                        { locked: false },
            // this is the active filter that will be applied to all survey records in client, 
            // updating 'availSurveys' as the records change
                        function(survey) {
                            return !survey.get('locked');
                        });
    
        completed = store.filter('participation', 
                        { 
                            user         : userId,
                            hasCompleted : true
                        }, 
                        function(participation) {
                            return participation.get('hasCompleted');
                        });
    
        outstanding = store.filter('participation', 
                        { 
                            user         : userId,
                            hasCompleted : false,
                            survey       : { locked: false }
                        }, 
                        function(participation) {
                            // this is also a promise!
                            return participation.get('survey').then(function(survery) {
                                return !participation.get('hasCompleted') && !survey.get('locked');
                            });
                        });
    
        // alternatively, hashSettled waits until all promises in hash have resolved before continuing
        Ember.RSVP.hash({
            availSurveys : availSurveys,
            completed    : completed,
            outstanding  : outstanding
        }).then(function(hash) {
            controller.set('availSurveys', hash.availSurveys);
            controller.set('completed',    hash.completed);
            controller.set('outstanding',  hash.outstanding);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多