Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 具有异步关系的Ember Data store.filter_Ember.js_Ember Data - Fatal编程技术网

Ember.js 具有异步关系的Ember Data store.filter

Ember.js 具有异步关系的Ember Data store.filter,ember.js,ember-data,Ember.js,Ember Data,我正在开发一个调查应用程序,我们正在使用一个现有的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}), sur

我正在开发一个调查应用程序,我们正在使用一个现有的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从模型钩子返回一个live record数组,但是此筛选器需要处理当前用户的调查记录和异步参与者记录。如何在筛选器回调函数中处理异步关系解析

  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');
  }
});

但是,在我的筛选器中使用async属性participation.get'poll.locked'是否会造成潜在问题?

最初以ES6和ember cli格式编写了我的响应,同时本地化了ember引用。。。请原谅,如果这是一个触摸基本,因为我把它恢复到ES5,并使用普遍理解的代码结构的余烬

试试这个:

// 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);
    });
}