灰烬-初始加载时没有数据具有很多关系

时间:2018-07-14 18:19:50

标签: javascript ember.js ember-data ember-cli

ember-cli-3.20,ember-data-3.30

我正在尝试在控制器设置中以hasMany关系修改数据,但是该关系没有数据。但是,页面完全加载后,所有数据都存在(即在我的模板/动作中,所有关系数据都存在)

我有一个与问题具有多对多关系的测验应用程序。

models / Quiz.js

import { computed } from '@ember/object';
import DS from 'ember-data';

const { attr, hasMany, Model } = DS;

export default Model.extend({
  description: attr('string'),
  questions: hasMany('question', {async: true}) //also tried with async false

});

models / Question.js

export default Model.extend({
  question: attr('string'),
  quizzes: hasMany('quiz', {async: true}) //also tried with async false
});

转到url'/ quiz / 1'并在测验中路由调用findRecord

路线/测验/quiz.js

import Route from '@ember/routing/route';

export default Route.extend({
  model(params) { return this.store.findRecord('quiz', params.quiz_id); }
});

控制器/测验/quiz.js

import { computed } from '@ember/object';
import Controller from '@ember/controller';

export default Controller.extend({
  quiz: computed.alias('model'),

  //also attempted in setupController/afterModel in router
  modelChanged: function() {
    let quiz = this.get('quiz');
    let questions = quiz.get('questions'); //questions has no data
    questions.then(questions => {
      Promise.all(questions.map(question => {
        //modify questions/answers here
      }));
    });
  }.observes('model')

actions: {
  getQuestions() {
    let questions = this.get('quiz.questions');  //questions now has data
  }
})};

我试图没有问题地在setupController()和afterModel()中获取问题数据。

注意: 测验是嵌套的路线,可以在要显示的每个测验之间进行选择。因此,如果您从“ / quiz / 1”导航到“ / quiz / 2”,然后返回“ quiz / 1”,则问题数据在观察者,setupController,afterModel等中可用。因此,第二次访问进行特定测验时,可以在设置中获得数据。 (数据始终在模板/操作中可用)。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

临时解决方法:

在'quiz.questions'上使用观察者以及一个标志来检查是否是第一次击中观察者。

import { computed } from '@ember/object';
import Controller from '@ember/controller';

export default Controller.extend({
  quiz: computed.alias('model'),

  areAnswersSet: false,

  observeQuestions: function() {
    let questions = this.get('quiz.questions');
    if (!this.areAnswersSet && questions.length !== 0) {
      this.toggleProperty('areAnswersSet');
      questions.forEach(question => { //modify question });
    }
  }.observes('quiz.questions.[]')

缺点:每次问题更改时,观察员仍然会被呼叫。仅在初始加载时需要。

答案 1 :(得分:0)

Ember Data 3.3.0中有一些与关系有关的错误。值得升级到Ember Data 3.3.1,看看您的问题是否消失了……